使用 PHP cURL 固定证书
Certificate Pinning with PHP cURL
我看到 SO 中有很多 post,关于错误:
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 而且我不知道常量的实际值是多少)
基本上这个问题是因为 PHP 本身用来自 Remi 的 yum 安装没有用支持它的 curl 和 openssl 编译。
所以我们必须更新 curl、openssl、从源代码编译 PHP 并且它起作用了。
我看到 SO 中有很多 post,关于错误:
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 而且我不知道常量的实际值是多少)
基本上这个问题是因为 PHP 本身用来自 Remi 的 yum 安装没有用支持它的 curl 和 openssl 编译。 所以我们必须更新 curl、openssl、从源代码编译 PHP 并且它起作用了。