Composer报SSL证书过期错,实为PHP使用的CA证书包过时;需下载最新cacert.pem并配置php.ini中openssl.cafile和curl.cainfo指向它,重启PHP后验证生效。

composer install 报错 “SSL certificate problem: certificate has expired”
这是 Composer 在 HTTPS 请求时校验 CA 证书失败的典型表现,不是 Composer 自身证书过期,而是它依赖的系统或 PHP 内置的 CA 证书包太旧,无法验证现代 TLS 站点(如 packagist.org)的证书链。
常见错误现象:file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages: error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed 或直接提示 SSL certificate problem: certificate has expired。
- 优先检查 PHP 的
openssl.cafile或curl.cainfo配置是否指向一个过时的cacert.pem - 运行
php -r "print_r(openssl_get_cert_locations());"查看当前 PHP 加载的 CA 路径,重点看default_cert_file - 如果路径存在但文件是 2021 年前的版本(比如来自旧版 XAMPP、WAMP 或手动下载未更新),就极大概率是它的问题
怎么更新 PHP 使用的 CA 证书(Windows/macOS/Linux 通用)
Composer 本身不维护证书,它复用 PHP 的 OpenSSL 或 cURL 底层能力。更新证书本质是让 PHP 知道用哪个新 cacert.pem。
- 去 https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251 下载最新
cacert.pem,保存为本地路径,例如/usr/local/etc/php/cacert.pem(macOS/Linux)或C:\php\cacert.pem(Windows) - 编辑
php.ini,取消注释或新增两行:openssl.cafile=/path/to/cacert.pemcurl.cainfo=/path/to/cacert.pem - 重启 Web 服务(如 Apache/Nginx)和 CLI 的 PHP 进程,执行
php --ini确认配置已加载,再运行php -r "var_dump(openssl_get_cert_locations());"验证路径是否生效
临时绕过 SSL 校验(仅限调试,严禁生产)
这不是修复,是掩盖问题。仅当证书更新流程卡住、又急需跑通 CI 或本地开发时用,且必须清楚后果。
- 全局禁用(高风险):
composer config -g secure-http false—— 这会让所有包源走 HTTP,可能被劫持 - 单次跳过(稍好一点):
composer install --no-secure-http—— 仅本次命令忽略,但仍会警告 - 环境变量方式(CI 常用):
export COMPOSER_NO_SSL=true后再运行 composer 命令 - 注意:以上操作不会解决根本问题,下次更新依赖或换环境仍会失败;而且 Packagist 自 2022 年起已强制 HTTPS,
secure-http=false可能直接报错退出
为什么 vendor/autoload.php 有时也报 SSL 错误?
这不是 autoload 本身的问题,而是某些包在 autoload 的 files 或 psr-4 映射里,动态 require 了远程资源(比如调用 file_get_contents('https://...')),或触发了包内初始化时的 HTTP 请求(如 Guzzle、HTTP client 初始化失败)。
- 先确认错误堆栈里真正出错的文件是不是你自己的代码,还是某个第三方包的
src/或vendor/下的文件 - 如果是第三方包,说明它内部用了不带证书校验的 HTTP 客户端,需查该包 issue 是否已修复,或降级到上一稳定版
- 不要试图在
vendor/autoload.php里加stream_context_set_default()来覆盖全局 SSL 设置——这会影响所有后续 HTTP 请求,不可控
composer.json 或重装 Composer,却没意识到问题藏在 php.ini 里那一行 curl.cainfo 指向的文件已经三年没更新了。










