PHP curl的SSL错误

4

大家好,

我正在制作一个带有https连接的API。我想通过证书检查来保护API调用。现在我已经从curl下载了cacert.pem并将其放在我的文件夹中,但它不起作用并给我报了这个错误:

SSL certificate problem: unable to get local issuer certificate

我非常确定cacert.pem文件的位置是正确的,但为了让大家更好地理解,这里提供一些我编写的代码:

 $ch = curl_init($url);
 curl_setopt($ch, CURLOPT_POST      ,1);
 curl_setopt($ch, CURLOPT_USERPWD, $this->api_key . ":" . $this->api_secret);
 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
 curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . "/cacert.pem");
 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
 curl_setopt($ch, CURLOPT_POSTFIELDS    ,$post_vars);
 curl_setopt($ch, CURLOPT_FOLLOWLOCATION  ,0);
 curl_setopt($ch,CURLOPT_HTTPHEADER,array('Accept: application/json'));
 curl_setopt($ch, CURLOPT_RETURNTRANSFER  ,1);  // RETURN THE CONTENTS OF THE CALL
 $data = curl_exec($ch);

我希望你们中的一些人能回答我的问题,因为我对SSL连接并不了解。
提前感谢!

http://curl.haxx.se/ca/有一个捆绑包。绝对路径:http://curl.haxx.se/ca/cacert.pem - Paul Oostenrijk
是的..我已经将它更改为777以确保可读性,但我仍然收到相同的错误 :( - Paul Oostenrijk
那么问题很可能出在你正在尝试访问的服务器上。这是你自己的服务器吗? - Ja͢ck
是的,没错。如果这很重要的话,它是从服务器到服务器的连接! - Paul Oostenrijk
1
我认为你可以从这个链接中找到解决方案:http://unitstep.net/blog/2009/05/05/using-curl-in-php-to-access-https-ssltls-protected-sites/ - user1671192
显示剩余3条评论
1个回答

2

确保证书捆绑包能被你运行的脚本读取后,下一步是调查服务器本身。

如果这是你自己的服务器,很可能你忘记安装中间证书,即在发行证书和捆绑包中附带的其中一个证书颁发机构之间的证书。

如果你正在使用自签名证书,则你的cacert.pem应该包含你连接到的服务器的公共证书;可以从私有证书生成它,这里提供了详细步骤(链接),称为.crt文件。


我在教程的第6步,但是我找不到虚拟主机文件?你知道它在默认情况下位于哪里吗? - Paul Oostenrijk
@PaulOostenrijk 这是包含所有<VirtualHost>块的文件,假设使用的是Apache。 - Ja͢ck
我将查找我的托管公司中的虚拟主机文件。我现在找不到它...您将会得到更新! - Paul Oostenrijk
我已经通过虚拟主机修复了它。但是我将我的中间证书和自签名证书添加到了cacert中。然后它就可以工作了。但这样安全吗? - Paul Oostenrijk
@PaulOostenrijk 中间证书应该被添加到您的服务器上以形成证书链 :) - Ja͢ck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接