![](/img/trans.png)
[英]Paypal Checkout error: “SSL certificate problem: unable to get local issuer certificate”
[英]Paypal Access - SSL certificate: unable to get local issuer certificate
我正在使用 cUrl 和 PHP 向服务器发出请求(用于 paypal 访问)
Paypal 开发者网站从未提及使用 PayPal 访问 API 需要 SSL 证书,但是我用来请求令牌的代码如下:
$options = array(
CURLOPT_URL => $url,
CURLOPT_POST => 1,
CURLOPT_VERBOSE => 1,
CURLOPT_POSTFIELDS => $postvals,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_SSLVERSION => 3
);
curl_setopt_array($ch, $options);
$response = curl_exec($ch);
echo curl_error($ch);
此回声输出以下错误:
SSL certificate problem: unable to get local issuer certificate
我的问题是:
1) 如果我只需要获取用户电子邮件,我是否需要 SSL 才能使用贝宝访问?
2) 如果我不需要 SSL 为什么会出现此错误?
PS:端点如下: https : //www.sandbox.paypal.com/webapps/auth/protocol/openidconnect/v1/tokenservice
正确的解决方案是修复您的 PHP 设置。将 CURLOPT_SSL_VERIFYPEER 设置为 false 是一个快速的技巧,但是当您禁用其证书颁发机构的证书验证时,这是错误的。 这使您面临中间人攻击。
很容易修复( php 5.3.7 或更高版本) -下载具有最新证书颁发机构的列表文件,并将此设置添加到您的php.ini
curl.cainfo=<path-to>cacert.pem
重新启动您的网络服务器,它会工作!
您可以通过添加以下内容来禁用 SSL 验证(从 cURL 7.10 开始默认启用):
CURLOPT_SSL_VERIFYPEER, false
到您的$options
,但是正确的方法是保持启用验证。
安全通告
如果远程站点使用已知 CA 颁发的证书但验证仍然失败,则很可能是远程服务器上的证书设置不正确(缺少中间证书等)。 或者,您的系统不知道使用了签署目标证书的证书颁发机构。 在这种情况下,您应该使用php.ini
的curl.cainfo
(文档)指向具有所有受支持 CA 的有效 PEM 文件 - 这将使您的设置正确验证发行者链。
请注意,将CURLOPT_SSL_VERIFYPEER
为false
您并没有解决问题! 你正在解决它。 这完全是为了安全,所以暂时这样做是可以的,但是在生产中部署它是不明智的,礼貌地说,因为您将对中间人攻击持开放态度。 你被警告了。
我有同样的问题
Can't connect to PayPal to validate IPN message: SSL certificate: unable to get local issuer certificate
我使用了在 paypal 的 github 上生成的代码示例(我使用了 PHP): https : //github.com/paypal/ipn-code-samples
我下载了两个证书并尝试从 curl 测试两者: http : //curl.haxx.se/docs/caextract.html
经过大约 2 小时的测试(使用 paypal 的 ipn 模拟器)和谷歌搜索,发现 paypal ipn 无法在localhost
上测试,所以我将代码实时推送并尝试测试,但仍然出现相同的错误(即使权限设置为 777)。
当我设置CURLOPT_SSL_VERIFYPEER, false
,它起作用了,但这会破坏拥有 ssl 证书的目的。
在窥探我服务器的文件后,我在我的 PHP 文件夹中发现了一个curl-ca-bundle.crt
文件。 我决定将我的 paypal ipn 脚本中的CURLOPT_CAINFO
硬编码到该路径。 它终于奏效了!
我注意到这个较旧的 .crt 文件包含一些不在 curl 网站上的最新 .crt 文件中的证书。 这是一堆来自verisign class 1, verisign class 2, verisign class 3 and verisign class 4
的证书。
这是我添加到 curl 的 .crt 文件的证书名称的完整列表:
这可能与@Andomar 所说的有关 - paypal 的 verisign 证书未包含在默认(默认情况下,我指的是 curl 的默认)安全证书列表中。
我没有时间调试并确定需要哪个证书,所以我只包含了所有证书。
对于将来遇到此问题的任何人,我建议从 curl 获取最新的证书,并将上面列表中的证书一一添加,直到错误消失。
这是其中一些 verisign 证书的链接(您可能需要在谷歌上搜索未列出的其他证书):www.symantec.com/page.jsp?id=roots
注意*:要查看贝宝的当前证书,您可以在终端中运行此命令:
openssl s_client -connect paypal.com:443 -showcerts
如果有人对这个问题有进一步的了解,请发表评论,因为我花了几个小时来弄清楚上述所有问题。
SSL 证书问题:无法获取本地颁发者证书
意味着 cUrl 不信任 Verisign,即为 PayPal 提供担保的证书颁发机构。 正如 Marc B 评论的那样,cUrl 不再附带对任何证书颁发机构的信任。
您可以使用以下选项绕过证书链验证:
CURLOPT_SSL_VERIFYPEER => 0
要了解如何配置 cUrl 以使其信任 Verisign,请阅读cUrl 文档。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.