PHP调用HTTPS接口SSL报错主因是客户端缺失CA证书或目标站点证书链不完整;需下载cacert.pem并配置php.ini中curl.cainfo和openssl.cafile,重启服务后验证;若目标站证书链不全,应使用fullchain.pem部署。
php脚本调用 https 接口失败,报错如 ssl certificate problem: unable to get local issuer certificate 或 peer's certificate issuer is not recognized,绝大多数情况不是 apache 本身出问题,而是 php 的 curl(或 stream)在发起请求时,无法验证目标服务器的证书链——根源常在于:apache 服务端配置正确,但 php 客户端缺少可信 ca 根证书,或目标站点证书链不完整,导致 php 无法构建信任路径。
确认是 PHP 客户端证书验证问题
先排除干扰:
- 用浏览器访问该 HTTPS 地址,看是否提示“不安全”或证书警告;若浏览器也报错,说明是目标站点证书链本身有问题(比如中间证书缺失),需对方修复;
- 在服务器终端执行:
curl -I https://target-domain.com,如果也失败,说明系统级 cURL 缺少 CA 包; - 运行 PHP 命令行测试:
php -r "print_r(openssl_get_cert_locations());",检查default_cert_file路径是否存在、是否可读; - 若路径为空或文件不存在,基本可判定为本地 CA 证书缺失。
补全 PHP 可信 CA 证书包(Windows / Linux 通用)
PHP 默认不自带完整 CA 列表,需手动指定权威根证书文件(Mozilla 维护的 cacert.pem):
- 下载最新 CA 包:https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251,保存为 UTF-8 无 BOM 格式,例如:
C:\php\extras\ssl\cacert.pem(Windows)或/etc/ssl/certs/cacert.pem(Linux); - 编辑
php.ini,取消注释并设置两处路径(二者作用不同,建议都配):
curl.cainfo = "C:/php/extras/ssl/cacert.pem"
openssl.cafile = "C:/php/extras/ssl/cacert.pem" - 重启 Apache 或 PHP-FPM,使配置生效;
- 验证方式:运行
php -r "var_dump(file_get_contents('https://httpbin.org/get'));",不再报 SSL 错误即成功。
检查目标网站证书链是否完整(影响 PHP 验证)
即使你本地 CA 包齐全,若 PHP 请求的目标 HTTPS 站点自身证书链不完整(比如只发了域名证书,没发中间证书),PHP 仍会因无法向上追溯而失败:
- 用 SSL Labs 测试目标域名:https://www.php.cn/link/c182dc5c90dc87dfee9cd309c33f19b3,重点看 “Certificate Chain” 是否显示 Incomplete;
- 若不完整,联系该网站管理员,要求其将域名证书与中间证书合并为
fullchain.pem(顺序:域名证书 → 中间证书),并在 Apache 中用SSLCertificateFile指向该文件; - 注意:Apache 2.4 不再使用
SSLCertificateChainFile,只靠单个 PEM 文件承载完整链; - Let’s Encrypt 用户务必使用
fullchain.pem(而非cert.pem)部署,否则 PHP 客户端极大概率握手失败。
临时绕过(仅限开发环境)
仅用于快速定位问题,严禁用于生产:
立即学习“PHP免费学习笔记(深入)”;
- 在 cURL 初始化后添加两行:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); - 必须两项同时禁用,缺一不可;
- 此操作等于关闭 HTTPS 的身份认证和加密保障,会暴露敏感数据,上线前必须撤回。



















