提问者:小点点

Paypal Access-SSL证书:无法获得本地发行者证书


我正在使用cUrl和PHP向服务器发出请求(用于贝宝访问)

Paypal开发者网站从未提及使用Paypal access 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来使用paypal访问?

2) 如果我不需要SSL,为什么会出现此错误?

PS:endpoint如下所示:https://www.sandbox.paypal.com/webapps/auth/protocol/openidconnect/v1/tokenservice


共3个答案

匿名用户

正确的解决方案是修复PHP设置。。将CURLOPT_SSL_VERIFYPEER设置为false是一个快速的攻击,但它是错误的,因为它的证书颁发机构禁用了证书验证。这会让你受到中间人的攻击。

很容易修复(php 5.3.7或更高版本)-下载带有最新证书权威的列表文件,并将此设置添加到您的php.ini
curl.cainfo=

重启您的Web服务器,它会工作!

匿名用户

您可以通过添加以下内容来禁用SSL验证(从cURL 7.10开始默认启用):

CURLOPT_SSL_VERIFYPEER, false

但是,正确的方法是保持启用验证。

安全通知

如果远程站点使用由已知CA颁发的证书,但验证仍然失败,则很可能是远程服务器上的证书设置不正确(缺少中间证书等)。或者,您的系统不知道签署目标证书的已用证书颁发机构。在这种情况下,您应该使用php。ini卷曲。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\u SSL\u VERIFYPEER,false时,它起作用了,但这会破坏拥有SSL证书的目的。

在窥探服务器的文件后,我发现了一个curlca包。我的PHP文件夹中的crt文件。我决定将paypal ipn脚本中的CURLOPT_CAINFO硬编码到该路径。终于成功了!

我注意到这一点。crt文件包含一些不是最新版本的证书。来自curl网站的crt文件。这是一堆来自verisign class 1、verisign class 2、verisign class 3和verisign class 4的证书。

以下是我添加到curl的. crt文件中的证书名称的完整列表:

  • Verisign 1级公共初级认证机构

这可能与@Andomar所说的有关-paypal的verisign证书不包括在安全证书的默认(默认情况下我指的是curl的默认)列表中。

我没有时间去调试和弄清楚到底需要哪个证书,所以我把它们都包括进去了。

对于将来遇到这个问题的人,我建议从curl获取最新的证书,并在上面的列表中逐个添加证书,直到错误消失。

以下是其中一些验证标志证书的链接(您可能需要谷歌搜索其他未列出的证书):www.symantec.com/page.jsp?id=roots

注意:要查看贝宝的当前证书,您可以在终端中运行以下命令:

openssl s_client -connect paypal.com:443 -showcerts

如果有人对这个问题有进一步的见解,请评论,因为我花了几个小时才弄清楚上述所有问题。