将CURLOPT_CAINFO与更新的CA捆绑包一起使用会导致证书验证失败 - php

我使用cURL来验证WordPress插件中的PayPal交易。最近,我开始收到有关用户由于无法验证交易而无法完成购买过程的错误报告。我跟踪到以下错误:

SSL certificate problem, verify that the CA cert is OK. Details: 
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

我在StackOverflow中发现了很多与同一问题相关的问题,其中大多数人说解决方案是使用CURLOPT_CAINFO cURL的选项提供一整套CA。我下载了http://curl.haxx.se/ca/cacert.pem的最新版本,并随附了该插件的最新版本(于2012年6月28日转换)。这解决了我收到的大多数问题。

现在的问题是,我刚收到另一笔付款失败的报告,并且错误是相同的:SSL certificate problem, verify that the CA cert is OK.。有趣的是,现在的解决方案是删除CURLOPT_CAINFO选项。我想知道是否对此有解释。我认为使用更新的CA捆绑包(例如我下载的捆绑包)是一种通用解决方案,但事实并非如此。

对于这种问题,一般的解决方案是什么?以及什么可以解释使用更新的CA捆绑软件导致SSL证书问题而不是解决它们?

这是cURL配置:

<?php
    $ch = curl_init("https://www.paypal.com/cgi-bin/webscr");
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_VERBOSE, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
    curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cacert.pem');
    curl_setopt($ch, CURLOPT_POSTFIELDS, $content);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
?>

更新:
www.paypal.com的证书由VeriSign签名。证书层次结构(如Firefox中所示)为:

VeriSign 3类公共主要证书颁发机构-G5
VeriSign 3类扩展验证SSL CA
www.paypal.com

我可以确认VeriSign 3类公共主要证书颁发机构的证书-我使用的http://curl.haxx.se/ca/cacert.pem版本中包含G5。

谢谢你的帮助。

参考方案

如果遇到此问题,请不要像别人建议的那样禁用对等和主机验证。

这将使您的通信容易受到潜在的中间人攻击,从而首先破坏了使用SSL的目的。

此问题的一种可能解释是,设置CURLOPT_CAINFO(尤其是设置为不正确的证书路径-我将对此进行两次检查)会覆盖服务器上的默认路径。

删除设置后,它会恢复为默认值(可以在PHP中设置)。

要记住的另一件事是CURLOPT_CAINFO是绝对路径。

cURL-加载具有CloudFlare保护的网站 - php

我有一个网站,我想使用cURL加载。但是,我正在谈论的站点正在使用cloudflare保护。在cURL request =>上,它说“检查您的浏览器,您将在5秒钟内被重定向”,我被重定向到一个不存在的页面,因为我认为我没有通过某些保护测试。我一直在寻找答案很长时间,但我发现只有两个有用的链接:Link 1Link 2但是我仍然无法弄清楚。对我有帮助吗?…

PHP-将日期插入日期时间字段 - php

我已在数据库中使用datetime字段存储日期,使用PHP将“今天的日期”插入该字段的正确方法是什么?干杯, 参考方案 我认为您可以使用php date()函数

php ziparchive类源代码 - php

Improve this question 我如何获取ziparchive类本身的源代码。 参考方案 假设您在谈论PHP ZipArchive class:下载PHP source code并查找适当的文件。如果您希望源代码是PHP代码,您可能会感到失望,因为源代码是用C语言编写的。或者,也可以在PHP Github Development Reposito…

PHP getallheaders替代 - php

我正在尝试从服务器上的apache切换到nginx。唯一的问题是我在PHP脚本中使用的getallheaders()函数,该函数不适用于Nginx。我已经尝试过用户在getallheaders函数上的php站点上提供的注释,但这并不返回所有请求标头。请告诉我如何解决这个问题。我真的想切换到Nginx。 参考方案 您仍然可以使用它,但是您必须像这里一样重新定义…

PHP-如何建议搜索字词,“你是说……?” - php

当使用不检索任何结果的术语搜索数据库时,我想允许“您是不是……”建议(例如Google)。例如,如果有人寻找“ jquyer””,它将输出“ did you mean jquery?”当然,建议结果必须与数据库内部的值匹配(我正在使用mysql)。您知道可以做到这一点的图书馆吗?我已经用谷歌搜索过,但是没有找到任何好的结果。或者,也许您有一个想法,该如何独自…