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
相关产品推荐
相关产品推荐

