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

不是 Composer 本身坏了,而是你本地 PHP 的 OpenSSL 扩展压根没加载到可信证书——修 php.ini 里的 curl.cainfo 和 openssl.cafile 就能解决,不用换镜像、不用重装 PHP。
怎么确认是 OpenSSL 证书路径问题,而不是网络或代理?
别猜,直接让 PHP 自己说话:
- 运行
php -r "print_r(openssl_get_cert_locations());",重点看default_cert_file和ini_cafile字段:如果为空、路径不存在、或对应文件大小为 0(ls -l /path/to/file),就是它了 - 再补一刀:
curl -v https://packagist.org/packages.json。如果也报SSL certificate problem: unable to get local issuer certificate,说明是 PHP/cURL 层级信任链断了,不是 Composer 特有问题 - Windows 用户尤其注意:
default_cert_file常指向C:\php\extras\ssl\curl-ca-bundle.crt,但该文件往往根本没下载或已被删
Windows 下必须同时配对 curl.cainfo 和 openssl.cafile
只改一个没用,PHP 会 fallback 到空信任链:
- 从 https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251 下载最新
cacert.pem,保存为绝对路径,例如:C:/php/extras/ssl/cacert.pem(推荐正斜杠,避免转义问题) - 编辑 CLI 模式下实际生效的
php.ini(先跑php --ini确认Loaded Configuration File路径),在末尾加两行,值必须完全一致、带双引号:curl.cainfo="C:/php/extras/ssl/cacert.pem"openssl.cafile="C:/php/extras/ssl/cacert.pem" - 改完必须关闭当前终端、新开一个——CLI 配置不重启终端不会生效;Web 环境(Apache/Nginx + php-fpm)则需重启对应服务
Linux/macOS 别迷信系统默认证书路径
/etc/ssl/certs/ca-certificates.crt 在很多发行版里是空链接或权限为 000,PHP 读不了:
- Homebrew PHP 用户:执行
sudo curl -o /usr/local/etc/php/cacert.pem https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251,再设curl.cainfo="/usr/local/etc/php/cacert.pem"(openssl.cafile可不设,cURL 优先级更高) - 确保读权限:
sudo chmod 644 /usr/local/etc/php/cacert.pem - Debian/Ubuntu 用户若坚持用系统路径,先验证:
ls -l /etc/ssl/certs/ca-certificates.crt,如果是符号链接,用readlink -f看真实路径,并确认该文件存在且非空 - Alpine 镜像用户:必须先
apk add ca-certificates,否则容器里压根没证书包
composer config --global cafile 为什么经常不起作用?
这条命令只影响 Composer 自己封装的 HTTP 客户端(基于 php-http),而绝大多数 SSL 报错发生在 PHP 原生 cURL 或 stream 扩展层面:
- 你运行
composer config --global cafile /path/to/cacert.pem后,composer diagnose可能显示 “CA file configured”,但composer install依然报错,就是典型表现 - Git 克隆依赖、某些插件调用、甚至部分 Composer 内部请求,都会绕过这个配置,直连 PHP cURL
- 真正起效的只有
php.ini中的curl.cainfo和openssl.cafile——它们控制整个 PHP 进程的 TLS 握手行为
最常被忽略的一点:CLI 和 Web 服务可能用的是完全不同的 php.ini,which php 和 php -i | grep 'Loaded Configuration File' 必须分别验证;改错文件等于白改。


















