根本问题是PHP的OpenSSL/cURL扩展找不到根证书文件,需在php.ini中用绝对路径同时配置openssl.cafile和curl.cainfo指向有效的cacert.pem,再重启对应服务验证。

根本问题不在 Composer,而在 PHP 的 OpenSSL 或 cURL 扩展找不到可用的根证书文件。直接改 composer config 几乎没用,必须让 PHP 自己加载正确的 cacert.pem。
怎么确认是证书路径问题
先跑这行命令:
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,说明不是 Composer 独有,而是整个 PHP/curl 层级的证书信任链断了。
php.ini 里必须同时设对这两个配置项
openssl.cafile 和 curl.cainfo 必须指向同一个有效的 PEM 文件,且路径必须是绝对路径。相对路径、~、单反斜杠(Windows)都会失效。
- Linux/macOS 推荐路径:
/usr/local/etc/php/cacert.pem(Homebrew PHP)或/etc/ssl/certs/ca-certificates.crt(Debian/Ubuntu,但注意它可能是符号链接,PHP 有时读不了) - Windows 推荐路径:
C:/php/extras/ssl/cacert.pem(正斜杠安全)或C:\php\extras\ssl\cacert.pem(双反斜杠) - 证书文件从哪来?直接下载官方维护的:https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251,别用旧版 XAMPP 自带的
在你 CLI 模式下实际加载的 php.ini(运行 php --ini 看 Loaded Configuration File)末尾加上:
openssl.cafile="/path/to/cacert.pem" curl.cainfo="/path/to/cacert.pem"
改完不重启 = 白改
CLI 下必须关掉当前终端、新开一个;Web 环境(Apache/Nginx + php-fpm)必须重启对应服务,光刷新页面或重载配置不够。
验证是否生效,三步走:
-
php -i | grep -E 'curl.cainfo|openssl.cafile'—— 输出应是你刚写的路径 -
php -r "var_dump(file_get_contents(ini_get('curl.cainfo')) !== false);"—— 应输出bool(true) -
php -r "print_r(openssl_get_cert_locations());"——default_cert_file要更新
为什么 composer config --global cafile 不起作用
这个设置只影响 Composer 自己封装的 HTTP 客户端(基于 php-http),而绝大多数 SSL 报错发生在底层的 cURL 或 OpenSSL 扩展层——它们完全不读 composer.json 或全局 config。设了等于没设。
同理,composer config --global secure-http false 不仅无效(Packagist 自 2022 年起强制 HTTPS),还会让后续命令直接退出报错。真正要动的,只有 php.ini 里的那两行。
最常被忽略的是:你以为改的是 CLI 的 php.ini,结果 composer install 走的是 Web SAPI 的另一个配置;或者证书文件权限不对(Linux/macOS 上 PHP 进程得有读权限);又或者 Windows 路径里混用了单反斜杠导致解析失败。


















