使用 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 并且它起作用了。