Paypal Access - SSL 证书:无法获取本地颁发者证书
Posted
技术标签:
【中文标题】Paypal Access - SSL 证书:无法获取本地颁发者证书【英文标题】:Paypal Access - SSL certificate: unable to get local issuer certificate 【发布时间】:2018-02-05 19:04:44 【问题描述】:我正在使用 cUrl 和 php 向服务器发出请求(用于访问贝宝)
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);
此回显输出以下错误:
SSL certificate problem: unable to get local issuer certificate
我的问题是:
1) 如果我只需要获取用户电子邮件,是否需要 SSL 才能使用贝宝访问?
2) 如果我不需要 SSL,为什么会出现此错误?
PS:端点如下:https://www.sandbox.paypal.com/webapps/auth/protocol/openidconnect/v1/tokenservice
【问题讨论】:
【参考方案1】:正确解决方案是修复您的 PHP 设置。将 CURLOPT_SSL_VERIFYPEER 设置为 false 是一种快速破解方法,但这是错误的,因为您禁用了其证书颁发机构的证书验证。这会使您面临中间人攻击。
很容易修复(php 5.3.7 或更高版本)-
Download 具有最新证书颁发机构的列表文件,并将此设置添加到您的 php.ini
curl.cainfo=<path-to>cacert.pem
重启你的网络服务器,它会工作的!
【讨论】:
我已经有一个类似的文件位于 /etc/ssl/certs/ca-certificates.crt(Gentoo Linux 发行版)。 在我的 WAMP 服务器设置上为我工作。谢谢。 或者,您可以在运行时指定证书:curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cacert.pem')
。现在你没有理由禁用验证了!
使用 xampp 在 Windows 服务器上工作。谢谢
我下载了 caert.pem 文件并将其保存在 C:\wamp\bin\php\php5.5.12
中,并带有适当的扩展名。我也修改并取消注释 curl.cainfo
路径的行,但我仍然得到同样的错误:/【参考方案2】:
您可以通过添加以下内容来禁用 SSL 验证(从 cURL 7.10 开始默认启用):
CURLOPT_SSL_VERIFYPEER, false
致您的$options
,然而正确的方法是保持启用验证。
安全通知
如果远程站点使用已知 CA 颁发的证书,但验证仍然失败,则很可能证书在远程服务器上设置不正确(缺少中间证书等)。或者,您的系统不知道使用的已签署目标证书的证书颁发机构。在这种情况下,您应该使用 php.ini
的 curl.cainfo
(documentation) 指向具有所有受支持 CA 的有效 PEM 文件 - 这将使您的设置正确验证颁发者链。
请注意,将CURLOPT_SSL_VERIFYPEER
设置为false
您不解决了问题!你正在解决它。这都是关于安全性的,所以暂时可以这样做,但礼貌地说,将其部署在生产环境中并不明智,因为您将对Man In The Middle Attack 持开放态度。您已收到警告。
【讨论】:
我不认为 -1 是合理的,因为答案清楚地表明了安全性【参考方案3】:我遇到了同样的问题
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 模拟器)和谷歌搜索,发现无法在 localhost
上测试 paypal ipn,所以我将代码实时推送并尝试测试,但仍然出现相同的错误(即使有权限)设置为 777)。
当我设置 CURLOPT_SSL_VERIFYPEER, false
时,它起作用了,但这会破坏拥有 ssl 证书的目的。
在查看了我的服务器文件后,我在我的 PHP 文件夹中找到了一个 curl-ca-bundle.crt
文件。我决定将我的 paypal ipn 脚本中的 CURLOPT_CAINFO
硬编码到该路径。终于成功了!
我注意到这个较旧的 .crt 文件包含一些不在 curl 网站的最新 .crt 文件中的证书。这是一堆来自verisign class 1, verisign class 2, verisign class 3 and verisign class 4
的证书。
这是我添加到 curl 的 .crt 文件中的证书名称的完整列表:
威瑞信 1 类公共主要证书颁发机构 威瑞信 1 类公共主要证书颁发机构 - G2 威瑞信 1 类公共主要证书颁发机构 - G3 威瑞信 2 类公共主要证书颁发机构 - G2 威瑞信 2 类公共主要证书颁发机构 - G3 威瑞信 3 类公共主要证书颁发机构 威瑞信 4 类公共主要证书颁发机构 - G2这可能与 @Andomar 所说的有关 - paypal 的 verisign 证书不包含在默认(默认情况下,我的意思是 curl 的默认)安全证书列表中。
我没有时间调试和确切地确定需要哪个证书,所以我只是将它们都包括在内。
对于以后遇到此问题的人,我建议从 curl 获取最新的证书,并在上面的列表中逐一添加证书,直到错误消失。
这是其中一些威瑞信证书的链接(您可能需要谷歌搜索未列出的其他证书):www.symantec.com/page.jsp?id=roots
注意*:要查看 paypal 的当前证书,您可以在终端中运行此命令:
openssl s_client -connect paypal.com:443 -showcerts
如果有人对此问题有进一步的了解,请发表评论,因为我花了几个小时才弄清楚以上所有内容。
【讨论】:
我可以通过添加来自 symantec.com/content/en/us/enterprise/verisign/roots/… 的 Verisign Class 3 Public Primary CA 来解决此问题 - 显然这是缺少的。【参考方案4】:SSL 证书问题:无法获取本地颁发者证书
表示 cUrl 不信任为 PayPal 提供担保的证书颁发机构 Verisign。由于 Marc B cmets,cUrl 不再信任任何证书颁发机构。
您可以使用以下选项绕过证书链验证:
CURLOPT_SSL_VERIFYPEER => 0
要了解如何配置 cUrl 以使其信任 Verisign,请阅读 cUrl documentation。
【讨论】:
并不奇怪。 curl 不再附带任何内置的 CA 证书,因此默认情况下它不信任任何人。 @MarcB:有趣的是,我假设它使用了操作系统证书存储。 那很好,但考虑到该商店有多少个地方,curl 最好只是去偏执并认为每个人都想得到它。 我强烈反对任何人关闭主机/对等验证。相反,下载 cURL CA 证书文件 (curl.haxx.se/ca/cacert.pem) 并包含它。尽快解决,从长远来看可以更好地保护您。 ^^ 我们为什么要信任这些证书。没有冒犯,只是说'以上是关于Paypal Access - SSL 证书:无法获取本地颁发者证书的主要内容,如果未能解决你的问题,请参考以下文章
Paypal Access - SSL 证书:无法获取本地颁发者证书