Composer SSL证书错误本质是PHP未配置CA证书路径,需统一设置php.ini中openssl.cafile和curl.cainfo为同一绝对路径的最新cacert.pem文件,并重启服务验证。

Composer 下载失败报 SSL certificate problem: certificate has expired
这是典型的 CA 证书库过期问题,不是 Composer 本身或网络配置错误。2024 年 9 月 30 日后,部分系统(尤其是较旧的 Linux 发行版、Docker 容器镜像、macOS Homebrew 安装的 OpenSSL)仍依赖已停用的 DST Root CA X3,导致访问 Packagist(https://packagist.org)等 HTTPS 源时握手失败。
验证是否是 CA 证书问题
先快速确认:运行 curl -I https://packagist.org。如果返回 curl: (60) SSL certificate problem: certificate has expired,基本可锁定为系统级 CA 证书库未更新。
- Ubuntu/Debian:检查
/etc/ssl/certs/ca-certificates.crt是否包含ISRG Root X1(而非只剩DST Root CA X3) - macOS(Homebrew OpenSSL):
brew info openssl@3看版本是否 ≥ 3.2.1;旧版默认不带新根证书 - Docker:基础镜像如
php:8.2-cli(基于 Debian 12)通常已修复,但php:7.4-cli(Debian 10)大概率仍有问题
更新系统 CA 证书库(推荐优先尝试)
比改 Composer 配置更安全、更根本。不同系统操作不同:
- Debian/Ubuntu:
sudo apt update && sudo apt install --reinstall ca-certificates,然后sudo update-ca-certificates - CentOS/RHEL 7+:
sudo yum update ca-certificates或sudo dnf update ca-certificates - macOS + Homebrew:
brew update && brew upgrade openssl@3,再确保 PHP 使用新版 OpenSSL(检查php -r "print_r(openssl_get_cert_locations());"中capath路径是否指向 Homebrew 的cert.pem) - Docker:在
Dockerfile中加RUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/*(Debian/Ubuntu 基础镜像)
临时绕过(仅限调试,勿用于生产)
不建议长期使用 composer config -g secure-http false 或 export COMPOSER_DISABLE_TLS=1 —— 这会让所有包下载走 HTTP,完全失去传输加密和签名校验。
- 真正安全的临时方案是手动指定可信证书路径:
composer config -g cafile /etc/ssl/certs/ca-certificates.crt(Linux)或composer config -g cafile $(brew --prefix)/etc/openssl@3/cert.pem(macOS) - 若仍报错,检查该文件是否存在、是否可读:
ls -l <code>cafile| grep -q 'Permission denied' && echo '权限不足' - 注意:PHP 自身的
openssl.cafile设置(php.ini)会覆盖 Composer 的cafile,需一并核对
CA 证书更新看似简单,但容易卡在路径没生效、PHP 加载了旧 OpenSSL、容器层缓存未清这几个点上。重点盯住 curl -v https://packagist.org 2>&1 | grep 'subject:' 输出的证书颁发者,确认看到的是 ISRG Root X1 而不是 DST Root CA X3。


















