Php Paypal访问-SSL证书:无法获取本地颁发者证书
我正在使用cUrl和PHP向服务器发出贝宝访问请求 Paypal开发者网站从未提及使用Paypal access API需要SSL证书,但我用于请求令牌的代码如下:Php Paypal访问-SSL证书:无法获取本地颁发者证书,php,curl,ssl,paypal,Php,Curl,Ssl,Paypal,我正在使用cUrl和PHP向服务器发出贝宝访问请求 Paypal开发者网站从未提及使用Paypal access API需要SSL证书,但我用于请求令牌的代码如下: $options = array( CURLOPT_URL => $url, CURLOPT_POST => 1, CURLOPT_VERBOSE => 1, CURLOPT_POSTFI
$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:端点如下所示:
SSL证书问题:无法获取本地颁发者证书
这意味着cUrl不信任Verisign,即为PayPal提供担保的证书颁发机构。正如Marc B评论的那样,cUrl不再提供任何证书颁发机构的信任
您可以使用以下选项绕过证书链验证:
CURLOPT_SSL_VERIFYPEER => 0
要阅读如何配置cUrl以使其信任Verisign,请阅读。您可以通过添加以下内容禁用默认情况下从cUrl 7.10开始启用的SSL验证:
CURLOPT_SSL_VERIFYPEER, false
但是,正确的方法是保持启用验证
安全通知
如果远程站点使用由已知CA颁发的证书,但验证仍然失败,则很可能证书在远程服务器上设置不正确,缺少中间证书等。。或者,您的系统不知道签署目标证书的已用证书颁发机构。在这种情况下,您应该使用php.ini的curl.cainfo指向所有受支持CA的有效PEM文件,这将使您的设置正确地验证颁发者链
请注意,通过将CURLOPT_SSL_VERIFYPEER设置为false,您并没有解决问题!你正在努力。这都是关于安全性的,所以暂时这样做是可以的,但礼貌地说,在生产环境中部署它是不明智的,因为您将对安全性持开放态度。您已收到警告。正确的解决方案是修复您的PHP设置。。将CURLOPT_SSL_VERIFYPEER设置为false是一个快速的攻击,但它是错误的,因为它的证书颁发机构禁用了证书验证。这会让你受到中间人的攻击
很容易修复php 5.3.7或更高版本-
包含最新证书颁发机构的列表文件,并将此设置添加到php.ini中
curl.cainfo=cacert.pem
重新启动web服务器,它就会工作 我也有同样的问题
Can't connect to PayPal to validate IPN message: SSL certificate: unable to get local issuer certificate
我使用了在paypal的github上生成的代码示例,我使用了PHP:
我下载了两个证书,并尝试从curl测试这两个证书:
在使用paypal的ipn模拟器和Google进行了大约2个小时的测试后,我发现paypal ipn无法在本地主机上进行测试,因此我实时推送代码并尝试测试,但即使权限设置为777,仍然会出现相同的错误
当我将CURLOPT_SSL_VERIFYPEER设置为false时,它起了作用,但这会破坏拥有SSL证书的目的
在窥探服务器的文件后,我在PHP文件夹中找到了一个curl-ca-bundle.crt文件。我决定将paypal ipn脚本中的CURLOPT_CAINFO硬编码到该路径。终于成功了
我注意到这个旧的.crt文件包含一些证书,这些证书不在curl网站上最新的.crt文件中。这是一堆来自verisign类别1、verisign类别2、verisign类别3和verisign类别4的证书
下面是我添加到curl的.crt文件中的证书名称的完整列表:
Verisign 1级公共初级认证机构
Verisign 1级公共主要认证机构-G2
Verisign 1级公共初级认证机构-G3
Verisign 2级公共主要认证机构-G2
Verisign 2级公共初级认证机构-G3
Verisign 3级公共初级认证机构
Verisign 4级公共主要认证机构-G2
这可能与@Andomar所说的有关——默认情况下,paypal的verisign证书不包括在默认的安全证书列表中
我没有时间去调试和弄清楚到底需要哪个证书,所以我把它们都包括进去了
对于将来遇到此问题的任何人,我建议从curl获取最新的证书,并在上面的列表中逐个添加证书,直到错误消失
下面是一些verisign证书的链接,您可能需要在谷歌上搜索其他未列出的证书:www.symantec.com/page.jsp?id=root
注意*:要查看paypal的当前证书,您可以在终端中运行此命令:
openssl s_client -connect paypal.com:443 -showcerts
如果有人对这个问题有更深入的了解,请发表评论,因为我花了几个小时来解决上述问题。这并不奇怪。curl不再附带任何内置的CA证书,因此默认情况下它不信任任何人。@MarcB:有趣的是,我假设它使用了OS证书存储。这很好,但考虑到
任何保存存储的地方,可能对curl来说都是最好的选择,让它变得偏执,认为每个人都想得到它。我会极力劝阻任何人关闭主机/对等验证。相反,下载curlca证书文件并包含它。同样可以快速解决问题,并且从长远来看可以更好地保护您。^^我们为什么要信任这些证书。无意冒犯,我只是说我已经在/etc/ssl/certs/ca-certificates.crt Gentoo Linux发行版上找到了一个类似的文件。在我的WAMP服务器设置中为我工作。谢谢。或者,您可以在运行时指定证书:curl_setopt$ch,CURLOPT_CAINFO,'/path/to/cacert.pem'。现在您没有理由禁用验证!使用xampp在windows服务器上工作。ThanksI下载了caert.pem文件,并将其保存在C:\wamp\bin\php\php5.5.12中,扩展名正确。此外,我还修改并取消了curl.cainfo路径行的注释,但我仍然得到了相同的错误:/我能够通过添加Verisign Class 3 Public Primary CA来解决这个问题-显然,这是缺少的一个。我不认为-1是合理的,因为答案清楚地说明了安全性