迁移至Windows服务器后调用Authorize.net支付出现PHP CURL错误#60
解决PHP从Linux迁移到Windows后CURL SSL证书错误#60的问题
我之前在把PHP项目从Linux迁到Windows服务器时,也碰到过完全一样的CURL错误——error #60: SSL certificate problem: unable to get local issuer certificate,就算注释掉CURLOPT_CAINFO的配置也没解决,给你几个亲测有效的排查和解决步骤:
1. 检查并配置PHP.ini中的CA证书路径
Windows环境下的PHP默认没有开启正确的CA证书配置,这是最常见的原因:
- 找到你的PHP安装目录下的
php.ini文件(注意:如果用IIS的话,可能需要检查站点对应的php.ini,不是系统全局的) - 下载最新的Mozilla根证书包(是一个名为
cacert.pem的文件),把它存到Windows服务器的一个固定路径,比如C:\php\ssl\cacert.pem - 打开
php.ini,找到curl.cainfo和openssl.cafile这两个配置项,去掉前面的注释(分号),设置为你刚才存放证书的路径:curl.cainfo = "C:\php\ssl\cacert.pem" openssl.cafile = "C:\php\ssl\cacert.pem" - 重启你的Web服务器(IIS、Apache或者Nginx),让配置生效
2. 排查代码中的SSL相关设置
虽然你注释了CURLOPT_CAINFO,但还要检查其他可能影响的选项:
- 不要轻易设置
CURLOPT_SSL_VERIFYPEER为false——这会关闭SSL证书验证,虽然能临时解决问题,但生产环境绝对不能这么做,会带来安全风险 - 确认
CURLOPT_SSL_VERIFYHOST的值是2(这是默认安全值,会验证证书中的主机名),如果被设为0或1也可能导致错误
3. 验证证书文件的权限和路径正确性
Windows下的文件权限和路径规则和Linux不一样,容易踩坑:
- 确保Web服务器的运行用户(比如IIS的
IUSR用户、Apache对应Windows账户)有读取cacert.pem文件的权限,不然就算路径对了也读不到证书 - 路径要用Windows的格式,要么用双反斜杠
C:\\php\\ssl\\cacert.pem,要么用正斜杠C:/php/ssl/cacert.pem,避免相对路径在Windows环境下解析错误,也可以用realpath()函数来获取绝对路径:$caCertPath = realpath(__DIR__ . '/../ssl/cert.pem'); if ($caCertPath) { curl_setopt($curl_request, CURLOPT_CAINFO, $caCertPath); }
4. 用Verbose日志定位具体问题
如果还是不确定问题在哪,可以写个简单的测试脚本,打印CURL的详细日志:
$ch = curl_init("https://你的支付接口URL"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_VERBOSE, true); // 捕获详细日志 $verboseLog = fopen('php://temp', 'w+'); curl_setopt($ch, CURLOPT_STDERR, $verboseLog); $response = curl_exec($ch); $error = curl_error($ch); // 读取日志内容 rewind($verboseLog); $logContent = stream_get_contents($verboseLog); echo "CURL错误信息: $error\n"; echo "详细日志:\n$logContent"; curl_close($ch); fclose($verboseLog);
运行这个脚本后,日志会告诉你是证书找不到、证书不被信任还是其他SSL握手问题,方便精准排查。
内容的提问来源于stack exchange,提问作者sjw0525
相关产品推荐
相关产品推荐

