我正在使用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
正确的解决方案是修复PHP设置。。将CURLOPT_SSL_VERIFYPEER设置为false是一个快速的攻击,但它是错误的,因为它的证书颁发机构禁用了证书验证。这会让你受到中间人的攻击。
很容易修复(php 5.3.7或更高版本)-下载带有最新证书权威的列表文件,并将此设置添加到您的php.inicurl.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文件中的证书名称的完整列表:
这可能与@Andomar所说的有关-paypal的verisign证书不包括在安全证书的默认(默认情况下我指的是curl的默认)列表中。
我没有时间去调试和弄清楚到底需要哪个证书,所以我把它们都包括进去了。
对于将来遇到这个问题的人,我建议从curl获取最新的证书,并在上面的列表中逐个添加证书,直到错误消失。
以下是其中一些验证标志证书的链接(您可能需要谷歌搜索其他未列出的证书):www.symantec.com/page.jsp?id=roots
注意:要查看贝宝的当前证书,您可以在终端中运行以下命令:
openssl s_client -connect paypal.com:443 -showcerts
如果有人对这个问题有进一步的见解,请评论,因为我花了几个小时才弄清楚上述所有问题。