【发布时间】:2012-09-06 17:15:41
【问题描述】:
我使用 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 中所示)是:
- 威瑞信 3 类公共主要证书颁发机构 - G5
- 威瑞信 Class 3 扩展验证 SSL CA
- www.paypal.com
我可以确认 VeriSign Class 3 Public Primary Certification Authority - G5 的证书包含在我正在使用的 http://curl.haxx.se/ca/cacert.pem 版本中。
感谢您的帮助。
【问题讨论】:
-
(您还有这个问题吗?)只是为了缩小查询范围:您是否为每个请求都从同一主机连接到 PayPal?意思是,相同的源代码,来自同一台机器,偶尔会抛出这个错误?
-
抱歉,回答迟了。上面的代码是 WordPress 插件的一部分。我看到使用相同源代码但机器不同的不同结果。一些用户在使用自定义证书包时报告了问题,而其他用户在使用默认包时报告了问题。我的解决方案是支持这两种情况:尝试使用自定义捆绑包并在没有它的情况下重复请求,以防出错。
-
有趣的问题。您描述的解决方案似乎是您最好的选择。如果不跟踪每个用户的 php + curl 版本,就很难找出原因:是权限问题、遗留 API、历史 php/curl 错误还是配置错误的主机?因素太多。可以这么说,我认为更喜欢自定义的最新 CA 包是一种很好的做法,并且对于配置良好的现代 php 环境应该是可靠的。