You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP-Curl仅单个域名报无法获取本地颁发者证书错误求助

解决PHP Curl错误码60(无法获取本地颁发者证书)的非禁用SSL方案

问题背景

PHP Curl访问特定API时触发错误码60,提示unable to get local issuer certificate,但存在以下异常现象:

  • 命令行Curl访问该API无问题
  • PHP Curl访问其他SSL域名、甚至使用相同中间证书(RapidSSL Global TLS RSA4096 SHA256 2022 CA1)的网站均正常
  • 已尝试通过php.ini及代码中curl_setopt配置cacert.pem,且确认目标API的根证书(Digicert Global Root CA)存在于CA存储中
  • testssl.sh检测发现目标API的信任链不完整

可行解决方案(无需禁用SSL验证)

1. 补全CA存储中的中间证书

从RapidSSL官方渠道下载对应的RapidSSL Global TLS RSA4096 SHA256 2022 CA1中间证书,将证书内容追加到PHP Curl当前使用的CA文件中(从verbose输出可知路径为/usr/local/etc/openssl@1.1/cert.pem)。操作完成后重启PHP服务,让配置生效。

2. 在代码中指定完整信任链的CA文件

  • 导出目标API的完整证书链(包含根证书+缺失的中间证书)为一个.pem格式文件
  • 在Curl请求中通过CURLOPT_CAINFO指定该文件路径:
    $ch = curl_init('https://your-target-api-domain.com');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    // 替换为你的完整信任链证书文件路径
    curl_setopt($ch, CURLOPT_CAINFO, '/absolute/path/to/full-chain-cert.pem');
    $response = curl_exec($ch);
    
    if (curl_errno($ch)) {
        echo 'Curl错误: ' . curl_error($ch);
    }
    
    curl_close($ch);
    

3. 对齐PHP Curl与命令行Curl的OpenSSL环境

  • 分别执行以下命令查看两者的OpenSSL版本:
    # 查看PHP关联的OpenSSL版本
    php -i | grep "OpenSSL"
    # 查看命令行Curl的OpenSSL版本
    curl --version
    
  • 如果版本不一致,说明PHP Curl依赖的OpenSSL库可能缺少对该中间证书的信任。可尝试升级PHP关联的OpenSSL库,或重新编译PHP使其与命令行Curl使用相同的OpenSSL环境。

问题原因解析

命令行Curl通常会自动从系统全局CA存储中补充缺失的中间证书,而PHP Curl默认使用的CA存储(即verbose输出中的/usr/local/etc/openssl@1.1/cert.pem)可能未包含该API所需的中间证书,导致信任链验证失败。即使根证书存在,缺少中间证书也无法完成完整的信任链构建,从而触发错误码60。

内容的提问来源于stack exchange,提问作者inecrafter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 00:01:06