31

我正在尝试使用 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);

所以我的问题是,我怎样才能将 curl 与 SNI 一起使用并仍然验证 SSL(不必使用 -k)。PHP 中是否有其他设置或我可以设置的 cURL 选项来解决这个问题?

4

2 回答 2

51

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

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

请注意,Curl 的调试-v代码ssl_tls_trace( v3.1 或更高版本,3 是相同的主要版本号)。

您可以使用 Wireshark 检查您安装的 curl 版本是否可以使用 SNI。如果您使用 建立连接curl -1 https://something,如果您展开“Client Hello”消息,您应该能够看到一个“ server_name”扩展名。

curl当您不使用-1(对于 TLS 1.0)或(对于 SSLv3)使用时,我不确定默认使用哪个 SSL/TLS 版本(取决于您的编译选项)-3,但是您可以尝试强制-1执行命令,因为它不会无论如何都不能使用 SSLv3。

于 2012-10-17T19:57:24.133 回答
38

连同所需的库和 Curl 版本,请求应使用 resolve 在 curl 中发送 SNI:

curl -vik --resolve example.com:443:198.18.110.10 https://example.com/
于 2018-10-16T21:59:20.373 回答