signature verification failed 的真实原因是系统时间偏差>5分钟、ca证书过期或镜像未同步gpg签名,三者独立且清缓存无效;须用php -r和curl命令交叉验证时间与证书,再确认镜像是否支持签名,最后切回官方源重装。

Signature verification failed 是时间、证书或镜像三者之一断了
不是镜像地址写错了,也不是缓存没清干净——Signature verification failed 出现在 Composer 2.2+,本质是它在拉取 packages.json 时,尝试用 Packagist 官方 GPG 公钥验证签名,但本地环境无法完成校验。三个独立原因必须逐个排除:system time >5 minutes off、CA certificate expired(比如含已吊销的 DST Root CA X3)、mirror doesn’t support or hasn’t synced GPG signatures。任一未修复,换镜像、清缓存、重装 Composer 都无效。
先确认 PHP 实际加载的证书路径和系统时间
别跳步骤,两条命令交叉验证:
- 运行
php -r "print_r(openssl_get_cert_locations());",重点看default_cert_file是否存在、可读,且文件里最新证书签发时间 ≥ 2022 年 - 运行
curl -I https://packagist.org/packages.json 2>/dev/null | head -1,返回HTTP/2 200才说明 HTTPS 通;若报SSL certificate problem,就是证书链或时间问题 - 检查系统时间:运行
date(Linux/macOS)或time(Windows CMD),偏差超过 5 分钟必须校准(sudo ntpdate -s time.nist.gov或 Windows 时间设置手动同步)
公钥配置只有一条有效路径:composer config --global signing-key
Composer 官方不提供 composer verify-signature 命令,也不存在项目级 "signature" 字段。唯一启用元数据签名验证的方式是:
- 确保
composer --version≥ 2.2.0(建议用 2.7.x) - 执行
composer config --global signing-key https://packagist.org/keys.json—— 这会下载并信任 Packagist 的 GPG 公钥 - 确认
secure-http: true(默认开启),且repo.packagist.org.allow_ssl_downgrade设为false(不能降级) - 运行
composer install -v,日志中出现Verifying packages.json signature with key才算真正生效
注意:keys.json 是公钥列表,不是私钥;你不需要、也不能手动导入 GPG 密钥环;第三方插件如 composer/composer-signature-checker 已废弃,在 PHP 8.1+ 下直接崩溃。
国内镜像大多不支持 GPG 签名,强行配会失败
阿里云、腾讯云、华为云等主流镜像目前**不转发或不生成 GPG 签名**,只同步原始 packages.json 内容。你配了 signing-key 后切到 https://mirrors.aliyun.com/composer/,composer install 仍会报 Invalid signature —— 因为镜像返回的 JSON 没被 Packagist 私钥签过名。
解决办法只有两个:
- 临时切回官方源:
composer config -g repo.packagist composer https://packagist.org,再跑composer install - 或干脆关掉签名验证(不推荐):
composer config --global disable-tls false不行,得用composer config --global secure-http false(但会同时禁用 HTTPS 校验,风险自担)
真正想用签名验证,就得接受直连 packagist.org,或者等镜像方明确声明支持 GPG 元数据签名——目前没有一家公开承诺支持。











