贝宝访问 – SSL证书:无法获得本地发行人证书

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

贝宝开发者网站从未提及使用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才能使用PayPal访问?

2)如果我不需要SSL为什么这个错误发生?

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

正确的解决scheme是修复您的PHP安装程序..设置CURLOPT_SSL_VERIFYPEER为false是一个快速的黑客攻击,但它是错误的,因为你禁用了证书颁发机构的证书validation。 这暴露了你的中间人攻击。

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

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

您可以禁用SSLvalidation(从cURL 7.10开始默认启用),方法如下:

 CURLOPT_SSL_VERIFYPEER, false 

到您的$options正确的方法是保持启用validation。

安全公告

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

请注意,通过将CURLOPT_SSL_VERIFYPEERfalseCURLOPT_SSL_VERIFYPEER问题! 你正在工作。 这一切都是关于安全的,所以一段时间就可以这样做了,但是把它部署到生产上并不明智,礼貌地说,因为你会接受中间人攻击 。 你被警告了。

我有同样的确切问题

 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进行testing: http : //curl.haxx.se/docs/caextract.html

经过大约2个小时的testing(使用paypal的ipn模拟器)和谷歌search,发现paypal ipn不能在localhost上testing,所以我推动代码生活,并尝试testing,但仍然得到了同样的错误(即使权限设置为777)。

当我设置CURLOPT_SSL_VERIFYPEER, false ,它的工作,但是这将打败具有SSL证书的目的。

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

我注意到这个旧的.crt文件包含了一些不在curl网站最新的.crt文件中的证书。 这是来自verisign class 1, verisign class 2, verisign class 3 and verisign class 4的一系列证书。

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

  • Verisign 1类公共主要authentication机构
  • Verisign 1级公共主要authentication机构 – G2
  • Verisign 1级公共主要authentication机构 – G3
  • Verisign第2类公共初级authentication机构 – G2
  • Verisign第2类公共主要authentication机构 – G3
  • Verisign第3类公共主要authentication机构
  • Verisign第4类公共主要authentication机构 – G2

这可能与@Andomar的说法有什么关系 – 贝宝的verisign证书不包括在默认(默认情况下,我指的是curl的默认)安全证书列表。

我没有足够的时间来debugging,并确定需要哪个证书,所以我只包含了所有的证书。

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

这里有一些verisign证书的链接(您可能需要谷歌为未列出的其他人):www.symantec.com/page.jsp?id=roots

注*:要查看贝宝的当前证书,您可以在terminal中运行此命令:

 openssl s_client -connect paypal.com:443 -showcerts 

如果有人对这个问题有进一步的了解,请在我花费数小时的时间来评论以上内容。

SSL证书问题:无法获得本地发行者证书

意味着cUrl不信任Verisign,这是certificatePayPal的证书颁发机构。 正如Marc B所说,cUrl不再信任任何证书颁发机构。

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

 CURLOPT_SSL_VERIFYPEER => 0 

要阅读如何configurationcUrl以使其信任Verisign,请阅读cUrl文档 。