我遇到了完全相同的问题
Can't connect to PayPal to validate IPN message: SSL certificate: unable to get local issuer certificate
我使用了Paypal在这里生成的代码样本(我使用PHP):
https://github.com/paypal/ipn-code-samples
我下载了两个证书并尝试从curl测试两个证书:
http://curl.haxx.se/docs/caextract.html
经过大约2小时的测试(使用Paypal的IPN模拟器)和搜索,发现Paypal IPN无法在本地主机上进行测试,因此我将代码推送到线上并尝试测试,但仍然遇到相同的错误(即使权限设置为777)。
当我设置
CURLOPT_SSL_VERIFYPEER, false
时,它可以工作,但这将使SSL证书失去意义。
在我的服务器文件中查找时,我在我的PHP文件夹中找到了一个
curl-ca-bundle.crt
文件。我决定在我的Paypal IPN脚本中硬编码
CURLOPT_CAINFO
到那个路径。最终它起作用了!
我注意到这个旧的.crt文件包含了一些最新的curl网站上没有的证书。这是来自
verisign class 1、verisign class 2、verisign class 3和verisign class 4
的一堆证书。
以下是我添加到curl的.crt文件中的完整证书名称列表:
- Verisign Class 1 Public Primary Certification Authority
- Verisign Class 1 Public Primary Certification Authority - G2
- Verisign Class 1 Public Primary Certification Authority - G3
- Verisign Class 2 Public Primary Certification Authority - G2
- Verisign Class 2 Public Primary Certification Authority - G3
- Verisign Class 3 Public Primary Certification Authority
- Verisign Class 4 Public Primary Certification Authority - G2
这可能与@Andomar所说的有关——PayPal的Verisign证书不包含在默认(默认指curl的默认)安全证书列表中。
我没有时间调试并找出确切需要哪个证书,所以我只包含了所有证书。
如果将来有人遇到这个问题,我建议从curl获取最新的证书,并逐个添加上述列表中的证书,直到错误消失。
这里有一些维信证书的链接(您可能需要在Google上搜索未列出的其他证书):www.symantec.com/page.jsp?id=roots
注意*:要查看PayPal的当前证书,可以在终端中运行此命令:
openssl s_client -connect paypal.com:443 -showcerts
如果有人对这个问题有进一步的见解,请在评论区留言,因为我花了数小时才找出以上所有内容。
curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cacert.pem')
。现在您已经没有理由禁用验证了! - Gras DoubleC:\wamp\bin\php\php5.5.12
中,具有正确的扩展名。 我还修改并取消注释了带有curl.cainfo
路径的行,但我仍然得到相同的错误 :/ - JCarlosR