假设一个网站在多台服务器之间进行负载平衡。我想运行一个命令来测试它是否正常工作,例如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终止点,还是单个实例?

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

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

#1 楼

我想我找到了遍历cURL手册的解决方案:[curl] 7.21.3中添加了

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



。在7.42.0中添加了删除支持。


从CURLOPT_RESOLVE解释了

评论


--resolve不存在于curl中...

–JustAGuy
2014年9月10日下午13:07

我的机器上的卷发(7.27.0)具有--resolve。

– Theron Luhn
15年1月16日在17:41

您可以使用curl -v看到它正常工作,并且可以看到curl在DNS缓存临时中添加了resolve选项,并使用了您指定的IP地址。

– CMCDragonkai
2015年10月19日,下午5:13

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 z

–约瑟·诺比尔
16年11月18日在5:23

请注意,如果将主机名用于IP_ADDRESS,它将默默地忽略该选项。

–熊佳亚诺夫
18年1月30日在19:12

#2 楼

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

这是语法:

192.168.10.20 www.domain.tld


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

评论


可以,但是我正在寻找一种不需要整体修改操作系统的方法

–马丁
2012年10月31日在9:35

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

– miono
2012年10月31日10:19



#3 楼

这是当前最受好评的答案的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.


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


#4 楼

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

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

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


您可以预先跳过方案/协议,但不能跳过端口号--resolve string。