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

Wil*_*ega 13 php curl

我使用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
Run Code Online (Sandbox Code Playgroud)

我在StackOverflow中发现了很多与同一问题有关的问题,他们中的大多数人说解决方案是使用CURLOPT_CAINFOcURL选项提供一堆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 configuartion:

<?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);
?>
Run Code Online (Sandbox Code Playgroud)

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

  • VeriSign Class 3公共主要认证机构 - G5
  • VeriSign Class 3扩展验证SSL CA.
  • www.paypal.com

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

谢谢你的帮助.

Tim*_*m K 11

如果你有这个问题,拜托你,千万不能因为有人建议禁止同行和主机验证.

这将使您的通信对潜在的中间人攻击开放,从而首先破坏了使用SSL的目的.

对此问题的一个可能的解释是,设置您的CURLOPT_CAINFO(特别是不正确的证书路径 - 我会对其进行双重检查)会覆盖服务器上的默认路径.

删除设置后,它将恢复为默认设置(可以在PHP中设置).

另外要记住的是,这CURLOPT_CAINFO是一条绝对的道路.


Abi*_*ain 3

看到这个网址

http://davidwalsh.name/php-ssl-curl-error

或者尝试一下

$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,'https://thirdparty.com/token.php'); //not the actual site
curl_setopt($ch,CURLOPT_TIMEOUT,60);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,'customer_id='.$cid.'&password='.$pass);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,true); 
curl_setopt($ch,CURLOPT_CAINFO,'mozilla.pem'); /* fixed! */
$result = curl_exec($ch);
if(empty($result)) { /* error: nothing returned */ } else { /* success! */ }
curl_close($ch);
Run Code Online (Sandbox Code Playgroud)

  • Tx @AbidHussain,我相信 mozzila.pem 是我使用的同一文件,但名称不同。使用该捆绑包解决了我所见过的大多数情况下的问题,但它也给其他用户带来了麻烦。这就是我现在想要理解的。 (2认同)