Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Paypal访问-SSL证书:无法获取本地颁发者证书_Php_Curl_Ssl_Paypal - Fatal编程技术网

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

Php Paypal访问-SSL证书:无法获取本地颁发者证书,php,curl,ssl,paypal,Php,Curl,Ssl,Paypal,我正在使用cUrl和PHP向服务器发出贝宝访问请求 Paypal开发者网站从未提及使用Paypal access API需要SSL证书,但我用于请求令牌的代码如下: $options = array( CURLOPT_URL => $url, CURLOPT_POST => 1, CURLOPT_VERBOSE => 1, CURLOPT_POSTFI

我正在使用cUrl和PHP向服务器发出贝宝访问请求

Paypal开发者网站从未提及使用Paypal access 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:端点如下所示:

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

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

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

CURLOPT_SSL_VERIFYPEER => 0

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

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

CURLOPT_SSL_VERIFYPEER, false
但是,正确的方法是保持启用验证

安全通知

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

请注意,通过将CURLOPT_SSL_VERIFYPEER设置为false,您并没有解决问题!你正在努力。这都是关于安全性的,所以暂时这样做是可以的,但礼貌地说,在生产环境中部署它是不明智的,因为您将对安全性持开放态度。您已收到警告。

正确的解决方案是修复您的PHP设置。。将CURLOPT_SSL_VERIFYPEER设置为false是一个快速的攻击,但它是错误的,因为它的证书颁发机构禁用了证书验证。这会让你受到中间人的攻击

很容易修复php 5.3.7或更高版本- 包含最新证书颁发机构的列表文件,并将此设置添加到php.ini中 curl.cainfo=cacert.pem


重新启动web服务器,它就会工作

我也有同样的问题

Can't connect to PayPal to validate IPN message: SSL certificate: unable to get local issuer certificate
我使用了在paypal的github上生成的代码示例,我使用了PHP:

我下载了两个证书,并尝试从curl测试这两个证书:

在使用paypal的ipn模拟器和Google进行了大约2个小时的测试后,我发现paypal ipn无法在本地主机上进行测试,因此我实时推送代码并尝试测试,但即使权限设置为777,仍然会出现相同的错误

当我将CURLOPT_SSL_VERIFYPEER设置为false时,它起了作用,但这会破坏拥有SSL证书的目的

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

我注意到这个旧的.crt文件包含一些证书,这些证书不在curl网站上最新的.crt文件中。这是一堆来自verisign类别1、verisign类别2、verisign类别3和verisign类别4的证书

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

Verisign 1级公共初级认证机构 Verisign 1级公共主要认证机构-G2 Verisign 1级公共初级认证机构-G3 Verisign 2级公共主要认证机构-G2 Verisign 2级公共初级认证机构-G3 Verisign 3级公共初级认证机构 Verisign 4级公共主要认证机构-G2 这可能与@Andomar所说的有关——默认情况下,paypal的verisign证书不包括在默认的安全证书列表中

我没有时间去调试和弄清楚到底需要哪个证书,所以我把它们都包括进去了

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

下面是一些verisign证书的链接,您可能需要在谷歌上搜索其他未列出的证书:www.symantec.com/page.jsp?id=root

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

openssl s_client -connect paypal.com:443 -showcerts

如果有人对这个问题有更深入的了解,请发表评论,因为我花了几个小时来解决上述问题。

这并不奇怪。curl不再附带任何内置的CA证书,因此默认情况下它不信任任何人。@MarcB:有趣的是,我假设它使用了OS证书存储。这很好,但考虑到
任何保存存储的地方,可能对curl来说都是最好的选择,让它变得偏执,认为每个人都想得到它。我会极力劝阻任何人关闭主机/对等验证。相反,下载curlca证书文件并包含它。同样可以快速解决问题,并且从长远来看可以更好地保护您。^^我们为什么要信任这些证书。无意冒犯,我只是说我已经在/etc/ssl/certs/ca-certificates.crt Gentoo Linux发行版上找到了一个类似的文件。在我的WAMP服务器设置中为我工作。谢谢。或者,您可以在运行时指定证书:curl_setopt$ch,CURLOPT_CAINFO,'/path/to/cacert.pem'。现在您没有理由禁用验证!使用xampp在windows服务器上工作。ThanksI下载了caert.pem文件,并将其保存在C:\wamp\bin\php\php5.5.12中,扩展名正确。此外,我还修改并取消了curl.cainfo路径行的注释,但我仍然得到了相同的错误:/我能够通过添加Verisign Class 3 Public Primary CA来解决这个问题-显然,这是缺少的一个。我不认为-1是合理的,因为答案清楚地说明了安全性