PHP报SSL证书错误的根本原因是OpenSSL或cURL扩展找不到可信根证书(CA),需统一配置openssl.cafile和curl.cainfo指向同一官方cacert.pem文件,并确认CLI版php.ini已加载且路径绝对、正确。

根本不是“安全连接被拒绝”,而是 PHP 的 OpenSSL 或 cURL 扩展在验证 HTTPS 证书时找不到可信的根证书(CA),导致整个 TLS 握手失败。它不反映网络连通性问题,也不代表镜像源不安全——连 https://mirrors.aliyun.com/composer/ 这类国内镜像也会报错。
先确认是不是 CA 证书缺失或路径失效
别猜,让 PHP 自己说它在用哪个证书文件:
运行:php -r "print_r(openssl_get_cert_locations());"
重点关注两个字段:
-
default_cert_file:PHP 默认尝试读的路径,如果为空、指向不存在的文件、或文件大小为 0,就是病灶 -
ini_cafile:来自php.ini的显式配置,如果和default_cert_file不一致,说明配置没生效或加载了错误的php.ini
常见失效路径包括:/etc/ssl/certs/ca-certificates.crt(旧版 Ubuntu)、C:/php/extras/ssl/cacert.pem(XAMPP 自带的老包)、/usr/local/etc/php/cacert.pem(Homebrew PHP 未更新时)。
openssl.cafile 和 curl.cainfo 必须同时设、路径完全一致
Composer 底层同时依赖 OpenSSL 层(如 file_get_contents)和 cURL 层(默认 HTTP 客户端),它们各自读一个配置项:
-
openssl.cafile控制 OpenSSL 层 -
curl.cainfo控制 cURL 层
只配一个?大概率仍有报错。路径写错(比如漏 .pem、用相对路径、Windows 下单反斜杠被当转义符)?照样失败。
正确做法:
- 从 https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251 下载最新
cacert.pem(必须是官方来源) - 存到稳定绝对路径,例如:
/usr/local/etc/php/cacert.pem(macOS/Linux)或C:/php/cacert.pem(Windows) - 在 CLI 环境使用的
php.ini中写(注意双引号包裹完整路径):openssl.cafile="/usr/local/etc/php/cacert.pem"<br>curl.cainfo="/usr/local/etc/php/cacert.pem"
别信 composer config --global cafile
很多人试过 composer config -g cafile "/path/to/cacert.pem",但依然报错——因为该配置只影响 Composer 自封装的 HTTP 客户端(如 php-http 驱动),而实际触发 cURL error 60 或 certificate verify failed 的是 PHP 原生的 cURL 或 stream 扩展,它根本不读这个配置。
临时绕过(仅限调试)可加环境变量:COMPOSER_NO_SSL=1 composer install(Linux/macOS)
或 Windows CMD:set COMPOSER_NO_SSL=1 && composer install
但这只是跳过校验,不解决证书链断裂本身;若你正用 Clash/Surge 等代理,还可能因 MITM 根证书未被 PHP 信任而持续失败。
最常被忽略的一点:CLI 和 Web SAPI 的 php.ini 是两套配置,Composer 走的是 CLI 版本。改完后务必运行 php --ini 确认加载的是你编辑的那个文件,并且重启终端或命令行环境——否则改了也白改。











