根本原因是PHP的curl或openssl扩展无法验证HTTPS服务器证书链,通常因缺少可信CA根证书或openssl.cafile/curl.cainfo配置错误;需检查php -r "print_r(openssl_get_cert_locations());"确认cafile路径有效性,并手动指定有效cacert.pem文件写入php.ini。

为什么 Composer 会报 SSL/TLS 证书验证失败?
根本原因是 PHP 的 curl 或 openssl 扩展无法验证 HTTPS 连接的服务器证书链,通常因为系统或 PHP 环境缺少可信的 CA 根证书,或者 openssl.cafile / curl.cainfo 配置指向了错误/过期/空的证书文件。
检查当前 PHP 使用的 CA 证书路径
运行 php -r "print_r(openssl_get_cert_locations());" 查看 PHP 实际加载的证书位置。重点关注 cafile 和 capath 字段:
Array
(
[default_cert_file] => /usr/lib/ssl/cert.pem
[default_cert_file_env] => SSL_CERT_FILE
[default_cert_dir] => /usr/lib/ssl/certs
[default_cert_dir_env] => SSL_CERT_DIR
[default_private_dir] => /usr/lib/ssl/private
[default_default_cert_area] => /usr/lib/ssl
[ini_cafile] => /etc/ssl/certs/ca-certificates.crt
[ini_capath] =>
)
如果 ini_cafile 是空、不存在,或指向一个损坏/为空的文件(比如只有注释或 0 字节),Composer 就会失败。
手动指定有效的 CA 文件并写入 php.ini
推荐使用 Mozilla 维护的 cacert.pem(由 cURL 官方定期更新):
- 下载最新版:
curl -L https://curl.se/ca/cacert.pem -o /usr/local/share/ca-certificates/cacert.pem - 确认文件可读:
ls -l /usr/local/share/ca-certificates/cacert.pem - 编辑 PHP 的主
php.ini(用php --ini查路径),添加或修改两行:
openssl.cafile=/usr/local/share/ca-certificates/cacert.pem curl.cainfo=/usr/local/share/ca-certificates/cacert.pem
重启 Web 服务或 PHP-FPM;命令行下直接运行 php -m | grep openssl 确认模块已加载,再执行 composer diagnose 验证是否通过。
临时绕过验证(仅限开发/调试)
不推荐长期使用,但可快速定位是否为证书问题本身:
- 全局禁用(危险):
composer config -g secure-http false—— 这会跳过所有 HTTPS 强制要求,但不解决证书验证失败的根本原因 - 单次命令禁用 SSL 检查:
COMPOSER_CAFILE=/dev/null composer install或curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false)不适用于 Composer 自身逻辑 - 更安全的临时方案:导出环境变量指定证书:
export SSL_CERT_FILE="/usr/local/share/ca-certificates/cacert.pem",再运行 Composer
注意:Docker 容器、Windows WSL、macOS Homebrew PHP 等环境常各自维护独立的证书路径,php.ini 和系统证书目录容易错配——必须逐层确认实际生效的是哪个配置项。










