php-贝宝访问-SSL证书:无法获取本地发行者证书

我正在使用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);

此回显输出以下错误:

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]

Luca Pennisi asked 2020-08-11T23:25:52Z
4个解决方案
120 votes

正确的解决方案是修复您的PHP设置。将CURLOPT_SSL_VERIFYPEER设置为false是一个快速技巧,但是由于您通过其证书颁发机构禁用了证书验证,因此这是错误的。 这使您容易受到中间人攻击。

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

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

oori answered 2020-08-11T23:26:11Z
12 votes

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

CURLOPT_SSL_VERIFYPEER, false

到您的3007327487488914752512,但是正确的方法是保持启用验证。

安全通知

如果远程站点使用已知CA颁发的证书,但验证仍然失败,则很可能是在远程服务器上错误地设置了证书(缺少中间证书等)。 或者,您的系统不知道有关用于签署目标证书的二手证书颁发机构的信息。 在这种情况下,您应使用CURLOPT_SSL_VERIFYPEERfalse(文档)指向具有所有受支持的CA的有效PEM文件-这将使您的设置正确验证发行者链。

请注意,将CURLOPT_SSL_VERIFYPEER设置为false并不能解决问题! 您正在解决它。 这全都与安全性有关,因此可以暂时执行此操作,但是礼貌地说,将其部署在生产环境中并不明智,因为您将对“中间人攻击”开放。 你被警告了。

Marcin Orlowski answered 2020-08-11T23:26:50Z
5 votes

我有同样的问题

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模拟器)并进行了谷歌搜索,发现不能在3007328141380680682752上对paypal ipn进行测试,因此我将代码实时推送并尝试进行测试,但仍然遇到相同的错误(即使权限设置为777)。

当我设置verisign class 1, verisign class 2, verisign class 3 and verisign class 4时,它可以工作,但是这样做会破坏获得ssl证书的目的。

窥探服务器文件后,我在PHP文件夹中找到了verisign class 1, verisign class 2, verisign class 3 and verisign class 4文件。 我决定在我的Paypal IPN脚本中将3007328141381380682753硬编码到该路径。 终于成功了!

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

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

  • 威瑞信1级公共一级证书颁发机构
  • Verisign 1类公共一级证书颁发机构-G2
  • 威瑞信1级公共一级证书颁发机构-G3
  • Verisign 2类公共主要证书颁发机构-G2
  • Verisign 2类公共主要证书颁发机构-G3
  • 威瑞信3级公共一级证书颁发机构
  • Verisign 4类公共主要证书颁发机构-G2

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

我没有时间调试和准确确定需要哪个证书,所以我只包括了所有证书。

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

这是其中一些Verisign证书的链接(您可能需要在Google上搜索未列出的其他证书):www.symantec.com/page.jsp?id=roots

注意*:要查看贝宝的当前证书,可以在终端中运行以下命令:

openssl s_client -connect paypal.com:443 -showcerts

如果有人对这个问题有进一步的了解,请发表评论,因为我花了几个小时才弄清以上所有问题。

Truchainz answered 2020-08-11T23:28:39Z
2 votes

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

意味着cUrl不信任Verisign,后者是担保PayPal的证书颁发机构。 正如Marc B所评论的那样,cUrl不再带有对任何证书颁发机构的信任。

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

CURLOPT_SSL_VERIFYPEER => 0

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

Andomar answered 2020-08-11T23:29:13Z
translate from https://stackoverflow.com:/questions/17478283/paypal-access-ssl-certificate-unable-to-get-local-issuer-certificate