贝宝访问 – 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.ini
的curl.cainfo
( 文档 )来指向所有支持CA的有效PEM文件 – 这将使你的设置正确地validation发行者链。
请注意,通过将CURLOPT_SSL_VERIFYPEER
为false
您CURLOPT_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文档 。