Composer install 报错 SSL certificate problem: certificate has expired 是因 CA 证书过期导致 HTTPS 校验失败,需更新 Composer 自带或系统级 CA 证书,优先执行 composer self-update,再检查并重置 cafile 配置或更新系统 ca-certificates 包。

composer install 报错 SSL certificate problem: certificate has expired
这是典型的 CA 证书过期导致的 HTTPS 请求失败,composer 在连接 packagist.org 或私有仓库时会校验证书链,一旦系统或 Composer 自带的 CA 包陈旧,就会触发该错误。
- 常见错误现象:
SSL certificate problem: certificate has expired、cURL error 60、Peer's Certificate issuer is not recognized - 不是网络问题,也不是代理配置错(除非代理本身篡改证书),本质是信任链断了
- Windows/macOS 用户更容易遇到:Composer 安装包自带的
ca-bundle.crt可能多年未更新;Linux 用户则更依赖系统级ca-certificates包,但若长期未运行apt update && apt install --reinstall ca-certificates同样会失效
怎么更新 composer 自带的 CA 证书
Composer 从 2.2.0+ 开始支持自动管理证书,但老版本或手动安装的二进制可能仍用静态 bundle。优先走自动刷新路径:
- 运行
composer self-update—— 确保你用的是最新版 Composer,它会同步更新内置证书 - 如果仍报错,强制重置证书缓存:
composer config -g cafile查看当前设置;若输出非空,先执行composer config -g --unset cafile - 然后让 Composer 重新生成默认证书路径:
composer diagnose会提示是否需要修复,按提示操作即可;或直接删掉旧 bundle(位置可通过php -r "print_r(openssl_get_cert_locations());"查看default_cert_file)
Linux/macOS 下如何更新系统级 CA 证书
Composer 默认会 fallback 到系统证书存储,所以修系统证书往往一劳永逸:
- Debian/Ubuntu:
sudo apt update && sudo apt install --reinstall ca-certificates,再执行sudo update-ca-certificates - CentOS/RHEL:
sudo yum reinstall ca-certificates或sudo dnf reinstall ca-certificates,然后sudo update-ca-trust - macOS(Homebrew):
brew reinstall ca-certificates,并确认/usr/local/etc/openssl@3/cert.pem(或其他 openssl 版本路径)被 PHP 正确读取;必要时在php.ini中显式设置openssl.cafile=/usr/local/etc/openssl@3/cert.pem
临时绕过(仅限调试,别上生产)
不推荐,但有时要快速验证是不是证书问题本身:
- 禁用证书校验:
composer config -g secure-http false—— 这会让所有仓库走 HTTP,极度危险,且新版 Composer 已默认拒绝此配置 - 更“轻量”的临时方案:
export COMPOSER_CAFILE="/path/to/current/cacert.pem",然后运行composer install;这个变量优先级高于内置 bundle,适合 CI 中注入最新证书 - 绝对不要在项目级
composer.json里写"config": {"secure-http": false},这等于把风险扩散给所有协作者
证书更新这件事,关键不在“怎么做”,而在于“谁在管”——Composer 自身、PHP 的 OpenSSL 扩展、操作系统三者证书源可能不一致,出问题时得一层层查 openssl_get_cert_locations() 输出,而不是只盯着 composer 命令本身。










