根本原因是php底层openssl/curl加载的ca根证书过期或路径失效,无法验证isrg root x1证书;需运行php -r "print_r(openssl_get_cert_locations());"确认实际路径,下载最新cacert.pem并正确配置php.ini中openssl.cafile和curl.cainfo后重启环境。

直接原因不是 Composer 本身证书过期,而是 PHP 底层 OpenSSL/cURL 加载的 CA 根证书文件太旧或路径失效——它无法验证 packagist.org 等现代 HTTPS 源使用的 ISRG Root X1 证书(DST Root CA X3 已于 2021 年 9 月过期)。修对地方,5 分钟内可恢复。
怎么确认 PHP 当前用的是哪个 CA 证书文件
别猜路径,用命令直接看 PHP 实际加载的位置:
运行:php -r "print_r(openssl_get_cert_locations());"
重点关注两个字段:
-
default_cert_file:PHP 默认尝试读取的路径,如果为空、指向不存在的文件、或文件大小为 0,就是根因 -
ini_cafile:来自php.ini的显式配置,如果和default_cert_file不一致,说明配置未生效或加载了错误的php.ini
Windows 常见路径如 C:phpextrassslcacert.pem,Linux/macOS 多为 /etc/ssl/certs/ca-certificates.crt 或 /etc/pki/tls/certs/ca-bundle.crt。打开该文件,搜索 -----BEGIN CERTIFICATE----- 后面的签发时间——若最后更新是 2022 年以前,基本可以确定是它。
下载并配置最新 cacert.pem(跨平台通用)
必须用官方维护的证书包,别信 XAMPP/WAMP 自带的旧文件(多数停更于 2021 年):
- 去 https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251 下载最新
cacert.pem - 保存到稳定路径,例如:
/usr/local/etc/php/cacert.pem(macOS/Linux),C:/php/extras/ssl/cacert.pem(Windows) - 编辑
php.ini(用php --ini确认位置),确保这两行存在且路径完全一致:
openssl.cafile="/path/to/cacert.pem" curl.cainfo="/path/to/cacert.pem"
注意:
- 路径必须用正斜杠
/或双反斜杠\,单反斜杠会被 PHP 当作转义符解析失败 - 路径里不能含中文、空格或特殊符号,否则 PHP 可能静默忽略
- 改完后,CLI 模式需关闭当前终端、新开一个;Web 模式(Apache/Nginx)必须重启整个服务,光重载配置不行
Composer 自带 ca-bundle.crt 过期怎么办
Composer 2.2+ 支持外部证书覆盖,但老版本或手动安装的 composer.phar 仍硬编码旧证书。此时 php.ini 配置无效,必须显式绑定:
- 先查当前是否已设置:
composer config --global cafile,若输出为空,说明正在用内置包 - 下载证书到 Composer 全局目录:
curl -sS https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251 -o ~/.composer/ca-bundle.crt(Linux/macOS)或curl -sS https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251 -o "%APPDATA%Composerca-bundle.crt"(Windows) - 全局启用:
composer config --global cafile ~/.composer/ca-bundle.crt(Windows 路径用正斜杠,如"C:/Users/xxx/AppData/Roaming/Composer/ca-bundle.crt") - 验证:
composer diagnose,确认 “CA file” 行指向你刚保存的路径
CI/CD 中推荐用环境变量:export COMPOSER_CAFILE="/tmp/cacert.pem" && curl -sS https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251 -o "$COMPOSER_CAFILE",避免配置残留。
为什么有些方法不起作用
常见踩坑点:
-
composer config --global cafile对packagist.org默认源无效——SSL 验证发生在 PHP cURL 层,它只读php.ini或系统证书库,不读 Composer 配置 -
composer config --global secure-http false在 Packagist 强制 HTTPS 后已失效,设了反而让composer install直接退出 -
composer self-update只更新二进制,不更新内置证书包;composer self-update --no-sigcheck是危险操作,跳过签名校验等于放弃安全底线 - 系统时间不准也会触发类似报错,务必先检查本地时钟是否同步
最稳的路径永远是:先用 openssl_get_cert_locations() 锁定实际加载路径,再换证书、配 php.ini、重启环境——绕开所有中间层干扰,直击根源。











