Composer提示证书已过期_更新Composer本地ca-bundle.crt文件【避坑】

9次阅读

composer报错“ssl certificate problem: certificate has expired”的根本原因是其内置ca-bundle.crt过期,需通过composer config –global cafile指定外部最新证书路径(如~/.composer/ca-bundle.crt)来解决,windows需注意路径格式与权限,CI/CD中推荐用COMPOSER_CAFILE环境变量动态设置。

Composer提示证书已过期_更新Composer本地ca-bundle.crt文件【避坑】

Composer报错“SSL certificate problem: certificate has expired”

这是 Composer 在 https 请求时校验证书失败的典型错误,根本原因不是系统证书库问题,而是 Composer 自带的 ca-bundle.crt 文件过期了——它硬编码composer.phar 里,不随系统更新,也不自动轮换。

如何定位并替换本地 ca-bundle.crt

Composer 会优先使用自身内置证书包;只有当配置了 openssl.cafile 或设置了环境变量 COMPOSER_CAFILE,才会跳过内置包。所以不能只靠更新系统 CA(比如 update-ca-certificates),必须显式干预。

  • 运行 composer config --global cafile 查看当前是否已设置自定义证书路径;若输出为空,说明正使用内置包
  • 下载最新 Mozilla CA 包:curl -sS https://curl.se/ca/cacert.pem -o ~/.composer/ca-bundle.crt
  • 全局启用它:composer config --global cafile ~/.composer/ca-bundle.crt
  • 验证是否生效:执行 composer diagnose,确认输出中 “CA file” 行指向你刚保存的路径

Windows 下需额外注意路径和权限

Windows 用户容易卡在路径解析或文件权限上。Composer 默认读取 %appDATA%Composer 目录,但 cafile 配置里的路径必须是正斜杠或双反斜杠,且不能含中文或空格。

  • 推荐保存位置:%APPDATA%Composerca-bundle.crt(即 C:Users{user}AppDataRoamingComposerca-bundle.crt
  • 配置命令用正斜杠:composer config --global cafile "C:/Users/{user}/AppData/Roaming/Composer/ca-bundle.crt"
  • 如果提示“failed to open stream”,检查文件是否被编辑器(如 VS Code)独占锁定,或杀毒软件拦截写入

CI/CD 环境中避免重复踩坑

gitHub Actions、gitlab CI 等场景下,每次新建容器都会重置 Composer 状态,硬编码配置不可靠。应改用环境变量驱动,且确保每次构建都拉取最新证书。

  • 在 CI 脚本开头加:export COMPOSER_CAFILE="/tmp/cacert.pem" && curl -sS https://curl.se/ca/cacert.pem -o "$COMPOSER_CAFILE"
  • 不要依赖 composer self-update —— 它只更新二进制,不更新内置证书包
  • 若使用 docker,可在 Dockerfilecopy 新证书,并设 ENV,比 runtime 下载更稳定

证书过期不是偶发故障,而是 Composer 内置证书包长期未更新的必然结果;手动绑定外部证书是目前最可控的方式,但要注意路径格式、权限和 CI 环境的隔离性。

text=ZqhQzanResources