composer ssl证书错误源于php openssl未正确加载ca证书,应通过php.ini配置openssl.cafile指向最新cacert.pem文件解决,而非禁用验证或修改composer配置。

composer install 报 SSL certificate problem 错误
这是 OpenSSL 验证失败的典型表现,不是 Composer 本身的问题,而是 PHP 的 curl 或 openssl 找不到可信 CA 证书,或证书过期。常见报错:SSL certificate problem: unable to get local issuer certificate 或 CURLOPT_SSL_VERIFYPEER failed。
别急着关验证——关了会暴露凭证、被中间人劫持。优先修根因:
- 确认系统 CA 证书路径是否被正确识别:运行
php -r "print_r(openssl_get_cert_locations());",看default_cert_file指向的文件是否存在且可读 - Windows 用户常见问题是 PHP 自带的
curl-ca-bundle.crt缺失或路径没配对;macOS/Linux 多数依赖系统级证书(如/etc/ssl/certs/ca-certificates.crt),但 Homebrew 安装的 PHP 可能没链接过去 - 临时验证是否是证书问题:用
curl -v https://packagist.org/packages.json看底层 curl 是否同样报错
改 php.ini 让 OpenSSL 找到证书
关键是让 PHP 的 OpenSSL 扩展加载正确的 CA 包,不是改 Composer 配置。
找到你当前 CLI 模式下生效的 php.ini(执行 php --ini 确认路径),在末尾加一行:
openssl.cafile=/path/to/cacert.pem
其中 /path/to/cacert.pem 推荐用官方维护的 Mozilla 根证书列表:
- 下载地址:
https://curl.se/ca/cacert.pem - 保存后确保路径在
php.ini中写绝对路径,不能用~或相对路径 - 改完重启终端,再运行
php -r "print_r(openssl_get_cert_locations());"确认default_cert_file已更新
composer config --global 这个命令不解决 SSL 问题
很多人试过 composer config --global secure-http false 或 composer config --global cafile /path/to/cacert.pem,但要注意:
-
cafile设置只影响 Composer 自己的 HTTP 客户端(基于php-http),不控制底层openssl或curl扩展行为——而 SSL 验证失败通常发生在扩展层 -
secure-http false会让 Composer 允许走 HTTP 源,但 Packagist 早就不支持 HTTP,且这会禁用所有 HTTPS 校验,存在凭据泄露风险 - 真正起效的是
php.ini中的openssl.cafile,不是 Composer 的配置项
CI 环境(GitHub Actions / GitLab CI)里证书失效怎么办
CI 镜像常精简证书包,或使用旧版 OpenSSL,导致默认证书路径为空或过期。
推荐做法是显式下载并注入:
- GitHub Actions 示例(在
steps中加):run: | mkdir -p $HOME/.composer curl -sS https://curl.se/ca/cacert.pem -o $HOME/.composer/cacert.pem echo "openssl.cafile=${HOME}/.composer/cacert.pem" >> $PHP_INI_DIR/php.ini - GitLab CI 同理,在
before_script中补证书 + 改php.ini - 避免用
export COMPOSER_CAFILE=...:这个环境变量只影响部分版本的 Composer,兼容性差
证书不是一次配置就永久有效,Mozilla 列表每三个月更新一次,CI 镜像里的内置证书可能半年没同步——所以自动化流程里显式拉取最新 cacert.pem 是最稳的做法。










