如何使用给定IP地址测试HTTPS URL


77

假设一个网站在多台服务器之间进行负载平衡。我想运行一个命令来测试它是否正常工作,例如curl DOMAIN.TLD。因此,为了隔离每个IP地址,我手动指定IP。但是许多网站可能托管在服务器上,因此我仍然提供主机标头,如下所示:curl IP_ADDRESS -H 'Host: DOMAIN.TLD'。以我的理解,这两个命令创建了完全相同的HTTP请求。唯一的区别是,在后一个示例中,我从cURL中取出了DNS查找部分,并手动执行了此操作(如果我输入错了,请更正我)。

到目前为止一切顺利。但是现在我想对HTTPS网址执行相同的操作。同样,我可以像这样测试它curl https://DOMAIN.TLD。但是我想手动指定IP,所以我运行curl https://IP_ADDRESS -H 'Host: DOMAIN.TLD'。现在我收到一个cURL错误:

curl: (51) SSL: certificate subject name 'DOMAIN.TLD' does not match target host name 'IP_ADDRESS'.

我当然可以通过告诉cURL不关心证书(“ -k”选项)来解决此问题,但这并不理想。

有没有办法将连接的IP地址与SSL认证的主机隔离?


您的负载均衡器是SSL终结点,还是单个实例?
rikola

有人可以解释为什么Host标头没有在后端为HTTPS选择正确的VHost和证书,但是仅对于HTTP来说可以正常工作。客户端是否将信息传递到后端(使用HTTPS协议)(无论使用IP还是使用域)?
NeverEndingQueue

@NeverEndingQueue要了解这一点,您需要了解TLS和HTTP之间的关系。服务器必须先显示证书,然后才能访问Host标头,因此--resolve固定IP地址的正确方法是正确的。
富兰克林于

Answers:


117

想想我通过cURL手册找到了一个解决方案:

curl https://DOMAIN.EXAMPLE --resolve 'DOMAIN.EXAMPLE:443:192.0.2.17'

在[curl] 7.21.3中添加。7.42.0中添加了删除支持。

来自CURLOPT_RESOLVE的解释


1
--resolve不存在于卷曲中
JustAGuy 2014年

7
我的机器上的卷发(7.27.0)具有--resolve。
塞隆·鲁恩

您可以看到它正在使用,curl -v并且可以看到curl将resolve选项添加到了DNS缓存临时性,并使用了您指定的IP地址。
CMCDragonkai,2015年

CentOS 6.8 curl:选项--resolve:是未知的curl:尝试使用“ curl --help”或“ curl --manual”以获取更多信息root @ server3 [〜]#curl -V curl 7.19.7(x86_64-redhat-linux -gnu)libcurl / 7.19.7 NSS / 3.21 Basic ECC zlib / 1.2.3 libidn / 1.18 libssh2 / 1.4.2协议:tftp ftp telnet dict ldap ldaps http文件https ftps scp sftp功能:GSS协商IDN IPv6大文件NTLM SSL libz
Jose Nobile

请注意,如果您使用的主机名IP_ADDRESS,它将默默地忽略该选项。
熊加米奥夫

11

您可以在/ etc / hosts中进行更改,以使服务器认为该域位于某个IP。

这是语法:

192.168.10.20 www.domain.tld

这将使cURL使用您想要的IP地址,而不会破坏SSL证书。


4
那行得通,但是我正在寻找一种不需要整体修改操作系统的方法
Martin

老实说,我认为没有其他办法。您必须获取cURL才能访问正确的域名以使证书起作用,并且将某个域映射到IP的方法是通过DNS或通过hosts-file。
miono 2012年

7

这是man当前最受好评的答案的条目,因为它们仅包含指向编程组件的链接:

--resolve <host:port:address>

    Provide  a  custom  address  for  a specific host and port pair. Using
    this, you can make the curl requests(s) use a specified address and 
    prevent the otherwise normally resolved address to be used. Consider 
    it a sort of /etc/hosts alternative provided on the command line. 
    The port number should be the number used for the specific protocol 
    the host will be used for. It means you need several entries if you 
    want to provide address for the same host but different ports.

    The provided address set by this option will be used even if -4, 
    --ipv4 or -6, --ipv6 is set to make curl use another IP version.

    This option can be used many times to add many host names to resolve.

    Added in 7.21.3.

但是由于给定的限制(“如果您想为同一主机但不同的端口提供地址,这意味着您需要几个条目。”),我会考虑另一个可以同时转换两个地址的更新选项:

--connect-to <HOST1:PORT1:HOST2:PORT2>

    For  a request to the given HOST:PORT pair, connect to 
    CONNECT-TO-HOST:CONNECT-TO-PORT instead. This option is suitable 
    to direct requests at a specific server, e.g. at a specific cluster 
    node in a cluster of servers. This option is only used to establish 
    the network connection. It does NOT affect the hostname/port that 
    is used for TLS/SSL (e.g. SNI, certificate verification) or for 
    the application protocols. "host" and "port" may be the empty string, 
    meaning "any host/port". "connect-to-host" and "connect-to-port" 
    may also be the empty string, meaning "use the request's original host/port".

    This option can be used many times to add many connect rules.

    See also --resolve and -H, --header. 
    Added in 7.49.0.

4

如果您在Windows中运行curl,请使用双引号

curl https://DOMAIN.TLD --resolve "DOMAIN.TLD:443:IP_ADDRESS"

curl DOMAIN.TLD --resolve "DOMAIN.TLD:80:IP_ADDRESS"

您可以预先跳过方案/协议,但是不能跳过--resolve字符串中的端口号。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.