使用带SNI的cURL(服务器名称指示)

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (867)

我正在尝试使用cURL发布到刚开始使用SNI的API(以便它们可以在1个IP地址上托管多个SSL证书)。

由于此举迁移至SNI,我的cURL停止工作。他们解释说,这是因为cURL获取* .domain-a.com而不是* .domain-b.com,所以SSL失败。

这似乎是cURL中的一个错误,因为从浏览器访问时,API URL没有错误。

使用这个代码,它确实有效:

exec('curl -k -d "parameters=here", https://urlhere.com/', $output);
print_r($output);

但是,使用-k是不好的,因为它不验证SSL证书。

使用此代码不起作用:

exec('curl -d "parameters=here", https://urlhere.com/', $output);
print_r($output);

所以我的问题是,我如何使用SNI卷曲并仍然验证SSL(不必使用-k)。PHP中是否有另一个设置或我可以设置的卷曲选项来解决此问题?

提问于
用户回答回答于

为了能够使用SNI,需要三个条件:

  • 根据更改日志,使用支持它的Curl版本,至少为7.18.1 。
  • 使用针对支持SNI的库编译的Curl版本,例如OpenSSL 0.9.8j(取决于某些较旧版本的编译选项)。
  • 至少使用TLS 1.0(不SSLv3)。

请注意,Curl的调试代码(-v)仅显示主要版本号(主要用于区分SSLv2和SSLv3 +类型的消息,请参阅ssl_tls_trace),因此当您使用TLS 1.0或更高版本时,它仍然会显示“SSLv3”(因为它们实际上是SSL v3.1或更高版本,3是相同的主要版本号)。

您可以检查您安装的curl版本是否可以使用Wireshark使用SNI。如果您使用连接curl -1 https://something,如果您展开“客户问候”消息,您应该能够看到“ server_name”扩展。

我不确定在curl没有-1(对于TLS 1.0)或-3(对于SSLv3)的情况下使用默认使用的SSL / TLS版本(取决于您的编译选项),但是您可以尝试强制-1执行命令,因为它赢得' t无论如何都可以使用SSLv3。

扫码关注云+社区

领取腾讯云代金券