2016-06-28 33 views
4

我看到有吨后的SO,有关错误:证书钢钉与PHP卷曲

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支持它......(它没有这样的常数,我有不知道常数的实际值是多少)

+0

总是可以尝试使用curl库定义的'CURLOPT_PINNEDPUBLICKEY'的整数值,即使PHP没有提供等效常量,请检查[curl头文件](https://github.com/curl/curl/ blob/master/include/curl/curl.h)。确保PHP使用的是支持它的cURL版本。 – apokryfos

+0

,关注@ apokryfos的角度来看,CURLOPT_PINNEDPUBLICKEY'的'值是230,因此尝试: 'curl_setopt($ CH,230, “SHA256 // TeyzGG/8dvpuksAeSCb3tsvLEHbY6w9q63tXhOIf0Tg =”);' – Carey

+0

@Carey从我在读卷曲apokryfos发布的标题,值是10230.因为STRINGPOINT是10000.但无论如何,它没有成功。我应用后没有看到任何更改,我可以连接到任何https服务器。但我确认cURL版本是7.49.1,应该支持。并使用命令curl:curl --pinnedpubkey“sha256 // TeyzGG/8dvpuksAeSCb3tsvLEHbY6w9q63tXhOIf0Tg =”--url https://google.ca也给了我适当的错误。 –

回答

0

基本上这个问题是因为安装了来自Remi的yum的PHP本身没有使用支持它的curl和openssl进行编译。 所以我们必须更新curl,openssl,从源代码编译PHP并且它工作正常。

+0

即使使用curl 7.50.1构建的curl扩展的最新PHP(7.0.11),我也尝试过这种方法。现在内置了对固定证书的支持,所以定义了CURLOPT_PINNEDPUBLICKEY(10230)等等,但即使我设置了证书锁定,我仍然会得到相同的错误60 - SSL证书问题:无法获取本地发行者证书'作为智商固定集的错误。我不应该得到具体的'curl:(90)SSL:公钥与指定的公钥不匹配!“如果指纹会出错,错误? – hpuiu