“signature verification failed”是本地环境与packagist信任链断裂所致,须按顺序排查系统时间偏差(>5分钟即失败)、php加载的ca证书是否含已吊销根证书(如dst root ca x3)、镜像是否停服或未同步签名元数据,并删vendor和composer.lock后切官方源重装。

“Signature verification failed”不是镜像坏了,而是本地环境与 Packagist 之间的信任链断了——时间、证书、元数据三者中任一不匹配都会直接中断安装,且不警告。
检查系统时间是否偏差超过 5 分钟
Composer 2.2+ 使用 JWT 校验 packages.json 签名,时间戳偏差 >5 分钟即拒绝。分布式打包机、虚拟机、CI runner 尤其容易出这问题。
- 运行
curl -I https://packagist.org 2>/dev/null | grep Date,记下响应头里的Date值 - 运行
date -R,对比两者差值 - 若偏差超 ±5 分钟,执行
sudo timedatectl set-ntp true && sudo systemctl restart systemd-timesyncd - 验证:重启 PHP 进程(如 FPM)或容器,再试
composer install
确认 PHP 加载的 CA 证书是否含已吊销根证书
常见于仍使用含 DST Root CA X3 的旧证书包,导致 HTTPS 连接失败,连不到签名校验环节。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 查实际路径:
php -r "print_r(openssl_get_cert_locations());",重点关注default_cert_file - 用
openssl x509 -in /path/to/cacert.pem -noout -dates 2>/dev/null | tail -1看最新证书签发时间,必须 ≥ 2022 年 - 若过期,下载新版:
curl -o /usr/local/share/ca-certificates/cacert.pem https://curl.se/ca/cacert.pem,然后sudo update-ca-certificates - 在
php.ini中显式设置:openssl.cafile=/usr/local/share/ca-certificates/cacert.pem和curl.cainfo=/usr/local/share/ca-certificates/cacert.pem
验证当前镜像是否已停服或未同步新签名
旧镜像如 https://packagist.phpcomposer.com 已于 2025 年底终止服务;新镜像若未及时同步 packages.json 的 GPG 签名,也会触发失败。
- 查当前配置:
composer config -g repo.packagist,输出必须是完整 JSON,例如{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"} - 若含
phpcomposer.com、laravel-china.org等域名,立刻停用 - 直连测试镜像可用性:
curl -I https://mirrors.aliyun.com/composer/packages.json 2>/dev/null | head -1,必须返回HTTP/2 200 - 若返回 HTML 或 404,说明该镜像不支持元数据签名验证,换用华为云或腾讯云镜像(二者已启用完整签名同步)
删 vendor 和 composer.lock 后切回官方源重装
缓存清理无效,因为问题不在本地磁盘缓存,而在 composer.lock 里硬编码了旧签名元数据,或 vendor 中残留了未验证的文件。
- 备份:
cp composer.lock composer.lock.bak - 删除:
rm -rf vendor composer.lock(Windows 用rd /s /q vendor & del composer.lock) - 切回官方源:
composer config -g --unset repos.packagist && composer config -g repo.packagist composer https://repo.packagist.org - 清缓存:
composer clear-cache - 重装:
composer install - 成功后,如需换镜像,等满 30 分钟再切(避开同步延迟窗口)
真正难排查的点在于:错误日志不提示具体是时间、证书还是镜像哪一层挂了。必须按顺序交叉验证——先 curl -I 看 HTTP 状态,再 php -r 查证书路径,最后看 composer config 输出格式。跳步就容易反复折腾。










