Composer SSL证书验证失败根源在PHP的curl.cainfo或openssl.cafile未正确配置,应运行php -r "print_r(openssl_get_cert_locations());"确认default_cert_file和ini_cafile路径是否有效,再下载官方cacert.pem并以绝对路径写入php.ini,重启环境后验证。

Composer 报 SSL 证书验证失败,不是 Composer 的锅,而是 PHP 底层 OpenSSL 或 cURL 找不到/读不了可信 CA 证书。关 TLS 或设 secure-http false 只是掩耳盗铃,真正要动的是 php.ini 里的 curl.cainfo 或 openssl.cafile。
怎么确认是不是证书路径问题
别猜,直接看 PHP 自己认不认证书路径:
- 运行
php -r "print_r(openssl_get_cert_locations());",重点看default_cert_file和ini_cafile字段值 - 如果为空、路径不存在、或文件大小为 0(比如只有几 KB),基本就是它了
- 再补一刀:用
curl -v https://packagist.org/packages.json测试,如果 curl 同样报SSL certificate problem: unable to get local issuer certificate,说明问题出在系统/PHP 层,不是 Composer 配置
Windows 下配 curl.cainfo 容易踩的坑
Windows 用户最常卡在这几步:
- 下载
cacert.pem后没放对位置——推荐固定存到C:\php\extras\ssl\cacert.pem(哪怕 PHP 装在其他盘) - 在
php.ini里写路径时用了单反斜杠C:\php\extras\ssl\cacert.pem却没加双引号,PHP 解析失败;必须写成curl.cainfo="C:\php\extras\ssl\cacert.pem"或curl.cainfo="C:/php/extras/ssl/cacert.pem" - 改了 CLI 的
php.ini,但 Web 环境(如 Apache)用的是另一个php.ini——务必先跑php --ini确认你正在编辑的是哪个文件 - 改完没重启终端或服务,
php -i | grep curl.cainfo还显示旧值
Linux/macOS 下优先用 curl.cainfo 而不是系统路径
别迷信 /etc/ssl/certs/ca-certificates.crt ——某些发行版它是空链接,PHP 读不了;Homebrew PHP 更常完全忽略它:
- 下载权威证书包:
curl -o /usr/local/etc/php/cacert.pem https://curl.se/ca/cacert.pem - 在
php.ini中只写一行:curl.cainfo="/usr/local/etc/php/cacert.pem"(路径必须绝对,且确保 PHP 进程有读权限) - Mac 上若用 Homebrew PHP,执行
brew services restart php;Linux 上重启php-fpm或apache2 - 验证:
php -r "var_dump(ini_get('curl.cainfo'));"输出应是你刚写的路径
为什么 composer config --global cafile 基本没用
这个配置只影响 Composer 自己封装的 HTTP 请求(比如 composer install 主流程),但绕不开 PHP 底层行为:
- 某些插件(如
hirak/prestissimo)或依赖脚本会直接调用file_get_contents()或stream_context_create(),它们走的是openssl.cafile或curl.cainfo -
composer config --global cafile设的路径,PHP 扩展根本看不到,照样报错 - CI 环境(如 GitHub Actions)里更明显:即使
composer config设了,php -r "openssl_get_cert_locations()"仍显示空路径,最终还是失败
真正难搞的不是下载证书,而是确认 PHP 进程读到的是你写的那个路径——openssl_get_cert_locations() 的输出才是唯一可信依据,其他都是猜测。


















