根本原因是PHP的OpenSSL/cURL缺少有效CA证书文件或使用过期cacert.pem;需通过php -r "print_r(openssl_get_cert_locations());"确认路径,再下载最新cacert.pem并配置php.ini中的openssl.cafile和curl.cainfo。

根本不是 Composer 或 phpEnv 的问题,而是 PHP 底层 OpenSSL/cURL 找不到有效的 CA 证书文件,或加载了一个过期的 cacert.pem。 你看到的 SSL certificate problem: certificate has expired 或 cURL error 60,99% 是这个原因——不是网络被墙,也不是镜像源配置错,更不是要删掉 auth.json 或关 HTTPS。
怎么确认 PHP 当前用的是哪个 CA 证书文件
phpEnv 多数基于 Windows + PHP ZIP 包,自带的 curl-ca-bundle.crt 或 cacert.pem 常是 2021 年前的老版本。先看它到底在读谁:
- 打开命令行,运行:
php -r "print_r(openssl_get_cert_locations());" - 重点看输出里的
default_cert_file和ini_cafile字段(比如C:\phpEnv\php\extras\ssl\cacert.pem) - 如果路径存在,用记事本打开该文件,搜
-----BEGIN CERTIFICATE-----后面的签发时间;如果最后更新是 2022 年以前,基本就是它 - 如果
ini_cafile是空字符串,说明 PHP 根本没配证书路径,必须手动指定
怎么换上最新 cacert.pem(Windows + phpEnv 专用)
别用 XAMPP/WAMP 自带的旧包,也别信“重装 phpEnv”——直接换证书文件最稳:
- 访问 https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251,右键「另存为」,保存为纯文本(后缀必须是
.pem,不要变成.pem.txt) - 推荐存到固定位置,例如:
C:\phpEnv\php\extras\ssl\cacert.pem(路径里不能有中文、空格) - 编辑
C:\phpEnv\php\php.ini(注意:不是 Apache 的 php.ini,是 phpEnv CLI 模式用的那个),找到或新增两行:
openssl.cafile="C:/phpEnv/php/extras/ssl/cacert.pem" curl.cainfo="C:/phpEnv/php/extras/ssl/cacert.pem"
- 路径用正斜杠或双反斜杠都行,但必须是绝对路径,且用英文双引号包裹
- 改完保存,关闭所有终端,重新打开命令行再试
- 验证是否生效:
php -r "var_dump(ini_get('curl.cainfo'));"应该输出你刚写的路径
为什么 composer config --global cafile 不起作用
很多人试过 composer config -g cafile "C:/.../cacert.pem",但依然报错——因为这行只影响 Composer 自己封装的 HTTP 客户端(php-http),而 SSL 验证失败实际发生在 PHP 的 cURL 或 OpenSSL 扩展层,它们完全不读 Composer 的配置。
-
composer config -g cafile只对部分插件或自定义 repo 生效,对 packagist.org 这类默认源无效 -
composer config -g secure-http false更危险:Packagist 自 2022 年起已强制 HTTPS,设了这个反而会让composer install直接退出 - 真正起效的只有
php.ini中的openssl.cafile和curl.cainfo - phpEnv 环境下,CLI 和 Web SAPI 往往共用同一份
php.ini,所以改一次就全链路修复
国内用户额外注意的两个坑
即使证书更新了,仍可能卡在 packagist.org 请求上——不是证书问题,而是网络干扰:
- 阿里云/腾讯云镜像源本身用 HTTPS,但如果其证书链不完整(比如缺中间证书),也会触发同类报错;建议搭配使用:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - 某些杀毒软件(如 360、腾讯电脑管家)会开启“HTTPS 流量扫描”,自动注入自签名根证书;此时就算换了
cacert.pem也白搭——需在杀软设置中关闭该功能,或把packagist.org加入白名单 - 临时验证是不是杀软导致:用纯净系统(如 Windows 安全模式)或 WSL2 下跑一次
composer diagnose,看 CA file 行是否 OK
最关键的一步永远是:运行 php -r "print_r(openssl_get_cert_locations());" 确认路径,再动手替换文件。别跳过这步,否则大概率改错地方、浪费半小时。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











