【发布时间】:2016-06-28 11:50:44
【问题描述】:
我看到 SO 中有很多关于错误的帖子:
SSL certificate problem: unable to get local issuer certificate
这是我得到的。
他们所有的答案都只是说从以下位置下载根证书:
https://curl.haxx.se/ca/cacert.pem
并设置到 CURLOPT_CAINFO 或设置 php.ini 的 curl.cainfo。
但这实际上只是告诉 cURL 信任根 CA 及其受信任 CA 的列表。
据我了解,证书固定应该忽略所有这些根 CA,只信任特定提供商的单个证书。
修复此错误的正确方法是什么?
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_CAINFO, '/etc/httpd/static.gc.apple.com.pem');
curl_setopt($ch, CURLOPT_CAPATH, '/etc/httpd/');
//curl_setopt($ch, CURLOPT_PINNEDPUBLICKEY, "sha256//TeyzGG/8dvpuksAeSCb3tsvLEHbY6w9q63tXhOIf0Tg=");
$sslCertificate = curl_exec($ch);
我知道 libcurl 本身,它有一个选项“CURLOPT_PINNEDPUBLICKEY”,它完全可以满足我的需要,但目前 PHP 仍然不支持它......(它在 PHP 中没有这样的常量,我不知道是什么常量的实际值)
【问题讨论】:
-
总是可以尝试使用 curl 库定义的
CURLOPT_PINNEDPUBLICKEY的整数值,即使 PHP 没有提供等效的常量,请检查 the curl header 的值。确保 PHP 使用的是支持它的 cURL 版本。 -
按照@apokryfos 的观点,
CURLOPT_PINNEDPUBLICKEY的值为 230,因此尝试:curl_setopt($ch, 230, "sha256//TeyzGG/8dvpuksAeSCb3tsvLEHbY6w9q63tXhOIf0Tg="); -
@Carey 从我在 apokryfos 发布的 curl 标题中读到的内容,该值为 10230。因为 STRINGPOINT 是 10000。但无论哪种方式,它都没有成功。应用后我看不到任何更改,我可以连接到任何 https 服务器。但我确认 cURL 版本是 7.49.1,应该支持。并使用命令 curl: curl --pinnedpubkey "sha256//TeyzGG/8dvpuksAeSCb3tsvLEHbY6w9q63tXhOIf0Tg=" --url google.ca 也给了我正确的错误。
-
您成功解决了这个问题吗?我有同样的问题,但似乎无法解决它......谢谢!
-
@hpuiu 请看我的回答。
标签: php ssl curl game-center