Composer SSL连接失败95%因PHP未加载可信CA证书,需在CLI生效的php.ini中同时配置绝对路径的curl.cainfo和openssl.cafile指向同一cacert.pem文件,并重启终端或服务验证。

Composer 报 SSL 连接失败,95% 不是镜像问题,而是 PHP 根本没加载可信 CA 证书——修对 curl.cainfo 和 openssl.cafile 才是正解,换镜像只是绕开网络干扰,不能修复证书链断裂。
怎么确认真是证书问题,而不是网络或镜像故障
别猜,用两行命令闭环验证:
- 运行
php --ini,确认你正在编辑的是 CLI 模式下真正生效的php.ini(phpEnv、XAMPP、Docker 等环境常有多个配置文件) - 再跑
php -r "print_r(openssl_get_cert_locations());",重点看default_cert_file和ini_cafile是否为空、路径是否存在、文件是否非空(ls -l /path/to/cert.pem或head -n 1 /path/to/cert.pem) - 顺手执行
curl -v https://packagist.org/packages.json:如果也报SSL certificate problem: unable to get local issuer certificate,说明问题在 PHP 底层 cURL / OpenSSL,和 Composer 配置无关
Windows 下 phpEnv 或 XAMPP 必须补全的 php.ini 配置
这类环境默认不设证书路径,必须手动添加且路径要绝对、可读、无转义错误:
- 从 https://www.php.cn/link/04c165998a3bfee2c2b46a8d8840dacc 直接保存为纯文本
cacert.pem(别用“另存为网页”,会带 HTML 标签) - 在 CLI 生效的
php.ini末尾加两行,路径用正斜杠/或双反斜杠\(单反斜杠会被 PHP 当作转义符):curl.cainfo = "C:/php/extras/ssl/cacert.pem"<br>openssl.cafile = "C:/php/extras/ssl/cacert.pem"
- 改完必须关闭当前终端、重开——CLI PHP 不热加载
ini;Web 环境需重启 Apache/Nginx/PHP-FPM - 验证是否生效:
php -r "var_dump(file_get_contents(ini_get('curl.cainfo')) !== false);"应输出bool(true)
Linux/macOS 下优先用系统 ca-certificates 包
手动下载 cacert.pem 容易过期难维护,系统包更可靠:
- Debian/Ubuntu:
sudo apt update && sudo apt install --reinstall ca-certificates,然后确认/etc/ssl/certs/ca-certificates.crt时间戳较新 - macOS(Homebrew PHP):
brew reinstall ca-certificates,再查brew --prefix ca-certificates得到路径,设curl.cainfo = "/opt/homebrew/etc/ca-certificates/cert.pem" - Alpine Linux(Docker):
apk add ca-certificates并运行update-ca-certificates - 无论哪种系统,改完都必须重启 PHP 进程(CLI 新开终端,Web 重启服务)
composer config -g cafile 为什么经常不起作用
这条命令只影响 Composer 自己封装的 HTTP 客户端(基于 php-http),而实际发起 HTTPS 请求的是 PHP 的 cURL 或 OpenSSL 扩展:
- 它无法覆盖
curl.cainfo的优先级,也不能修复底层 TLS 握手失败 - 你执行
composer config --global cafile /path/to/cacert.pem后,composer diagnose可能显示 “CA file configured”,但composer install仍报错,就是典型表现 - 它只在 Composer 使用自己的 HTTP 客户端时生效;一旦涉及 Git 克隆、cURL 直连或某些插件调用,还是会走 PHP 原生扩展
- 若必须临时指定(如 CI 环境无法改
php.ini),请用composer config -g repo.packagist.ssl.certificate-authority /path/to/cacert.pem,该配置写入~/.composer/auth.json,比环境变量COMPOSER_CAFILE更稳定
最易被忽略的一点:curl.cainfo 和 openssl.cafile 必须同时配置、值必须完全一致、路径必须是绝对路径且指向同一文件——只改一个,或路径不一致,PHP 仍会 fallback 到空信任链。


















