这不是证书真过期,而是本地系统时间偏差过大或PHP未加载有效CA证书;临时绕过仅能跑通命令,不能替代修复。

直接说结论:这不是证书真过期,而是你本地系统时间偏差过大或 PHP 未加载有效 CA 证书,临时绕过只是让你跑通命令,不是修复动作。
为什么composer install报“certificate has expired”?
典型错误信息是:SSL certificate problem: certificate has expired 或 cURL error 60: SSL certificate problem: unable to get local issuer certificate。但 packagist.org 和国内镜像站的证书根本没过期——问题几乎总是出在你本地:
- 系统时钟快了或慢了超过 2 分钟(尤其休眠唤醒后的 Windows、老旧 Docker 容器)
- PHP 的
openssl.cafile或curl.cainfo指向一个空文件、不存在的路径,或一份停更于 2021 年的老证书(无法验证 ISRG Root X1 等新根) - 你改过
composer.json里的镜像源为 HTTP,但没运行composer update --lock,导致composer.lock仍记录 HTTPS 地址,安装时照样失败
COMPOSER_CAFILE=/dev/null 是最底层有效的临时方式
这是唯一能真正跳过 OpenSSL 层证书链校验的环境变量,比 --no-secure-http 更底层、更可靠:
- Linux/macOS:
COMPOSER_CAFILE=/dev/null composer install - Windows CMD:
set COMPOSER_CAFILE= && composer install - PowerShell:
$env:COMPOSER_CAFILE=""; composer install - 注意:
/dev/null在 Windows 不生效,必须留空;且该变量只对当前 shell 有效,新开终端自动失效
COMPOSER_DISABLE_TLS=1 仅适用于支持 HTTP 的镜像
它不是“关 SSL”,而是强制降级为 HTTP 协议——前提是镜像站还开着 HTTP 接口:
- 旧版阿里云镜像(
http://mirrors.aliyun.com/composer/)可用,但新版已强制 HTTPS - packagist.org、Laravel China 等已全站 HTTPS,设了也无效,会直接报错
Connection refused - 执行前先用
curl -I http://mirrors.aliyun.com/composer/packages.json验证是否返回 200 - 设了之后记得清理:
unset COMPOSER_DISABLE_TLS(Linux/macOS)或set COMPOSER_DISABLE_TLS=(Windows)
别碰 --no-secure 或 --insecure
这些参数根本不存在,Composer 不识别:
-
composer install --no-secure→ 报错:Command "install --no-secure" is not defined -
composer update --insecure→ 同样报错,且不会影响任何证书逻辑 - 所有网上教程写这类 flag 的,都是把 cURL 或 Git 的参数误套到 Composer 上
- 真正起效的只有环境变量(
COMPOSER_CAFILE、COMPOSER_DISABLE_TLS)或 PHP 配置项
临时绕过最常被忽略的点:环境变量污染和 lock 文件残留。设了 COMPOSER_CAFILE 后如果忘了 unset,后续所有 Composer 命令都跳过证书校验;改了 composer.json 却不跑 composer update --lock,composer.lock 里还是 HTTPS 地址——这两个坑比绕过本身更容易让人反复踩。


















