Paypal访问 - SSL证书:无法获得本地颁发者证书

Luc*_*isi 41 php ssl curl paypal

我正在使用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);
Run Code Online (Sandbox Code Playgroud)

此echo输出以下错误:

SSL certificate problem: unable to get local issuer certificate
Run Code Online (Sandbox Code Playgroud)

我的问题是:

1)如果我只需要获取用户电子邮件,是否需要SSL才能使用PayPal访问?

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

PS:端点如下:https://www.sandbox.paypal.com/webapps/auth/protocol/openidconnect/v1/tokenservice

oor*_*ori 120

正确的解决方法是修复你的PHP设置..设置CURLOPT_SSL_VERIFYPEER为false是一个快速的黑客攻击,但你禁用证书验证通过它的认证机构这是错误的.这会让你暴露在中间人的攻击中.

它很容易修复(php 5.3.7或更高版本) - 下载具有最新证书颁发机构的列表文件,并将此设置添加到您的php.ini
curl.cainfo=<path-to>cacert.pem

重新启动您的Web服务器,它将工作!

  • 或者,您可以在运行时指定证书:`curl_setopt($ ch,CURLOPT_CAINFO,'/ path/to/cacert.pem')`.现在你没有理由禁用验证! (11认同)
  • 在我的WAMP服务器设置上为我工作.谢谢. (3认同)

Mar*_*ski 12

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

CURLOPT_SSL_VERIFYPEER, false
Run Code Online (Sandbox Code Playgroud)

对你来说$options,正确的方法是保持验证.

安全通知

如果远程站点使用由已知CA颁发的证书但验证仍然失败,则很可能在远程服务器上错误地设置了证书(缺少中间证书等).或者,您的系统不知道已使用签署目标证书的证书颁发机构.在这种情况下,你应该使用php.ini's curl.cainfo(文档)指向所有支持的CA的有效PEM文件 - 这将使您的设置正确验证发行者链.

请注意,通过设置CURLOPT_SSL_VERIFYPEERfalse解决这个问题!你正在努力.这是所有关于安全所以它的精细做了一段时间,但部署的生产并不明智,很有礼貌地说,因为你将成为开放的中间人攻击.你被警告了.

  • -1,打开自己的MITM并不是正确的答案. (16认同)
  • 我不认为-1是合理的,因为答案清楚地表明了安全性 (2认同)

Tri*_*mad 5

我有同样的问题

Can't connect to PayPal to validate IPN message: SSL certificate: unable to get local issuer certificate
Run Code Online (Sandbox Code Playgroud)

我使用在这里找到的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证书的目的.

窥探我服务器的文件后,我curl-ca-bundle.crt在PHP文件夹中找到了一个文件.我决定将CURLOPT_CAINFO我的paypal ipn脚本硬编码到该路径.它终于奏效了!

我注意到这个较旧的.crt文件包含一些证书,这些证书不在curl网站上的最新.crt文件中.这是一堆证书verisign class 1, verisign class 2, verisign class 3 and verisign class 4.

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

  • Verisign Class 1公共主要证书颁发机构
  • Verisign Class 1公共主要认证机构 - G2
  • Verisign Class 1公共主要证书颁发机构 - G3
  • Verisign Class 2公共主要认证机构 - G2
  • Verisign Class 2公共主要证书颁发机构 - G3
  • Verisign Class 3公共主要证书颁发机构
  • Verisign Class 4公共主要认证机构 - G2

这可能与@Andomar所说的有关 - paypal的verisign证书不包含在默认值(默认情况下,我的意思是curl的默认值)安全证书列表中.

我没有时间调试并确切地知道需要哪个证书,所以我只包括了所有证书.

对于将来遇到此问题的任何人,我建议从curl获取最新的证书,并逐一添加上面列表中的证书,直到错误消失为止.

以下是其中一些verisign证书的链接(您可能需要google以查找未列出的其他证书):www.symantec.com/page.jsp?id = root

注意*:要查看paypal的当前证书,您可以在终端中运行此命令:

openssl s_client -connect paypal.com:443 -showcerts
Run Code Online (Sandbox Code Playgroud)

如果有人对此问题有进一步的了解,请评论,因为我花了几个小时来计算以上所有内容.


And*_*mar 2

SSL证书问题:无法获取本地颁发者证书

意味着 cUrl 不信任 Verisign(为 PayPal 提供担保的证书颁发机构)。正如 Marc B 所评论的那样,cUrl 不再附带任何证书颁发机构的信任。

您可以使用以下选项绕过证书链验证:

CURLOPT_SSL_VERIFYPEER => 0
Run Code Online (Sandbox Code Playgroud)

要了解如何配置 cUrl 以使其信任 Verisign,请阅读cUrl 文档

  • 我强烈建议任何人不要关闭主机/对等验证。相反,下载 cURL CA 证书文件 (http://curl.haxx.se/ca/cacert.pem) 并包含它。解决问题的速度同样快,从长远来看,可以更好地保护您。 (5认同)
  • 那就太好了,但考虑到这家商店有多少个地方,对于卷曲来说,最好的办法可能就是变得偏执,认为每个人都想买它。 (3认同)
  • 并不奇怪。curl 不再附带任何内置的 CA 证书,因此默认情况下它不信任任何人。 (2认同)