应更新 Composer 内置密钥库:运行 composer keys rotate 重置公钥,再执行 composer keys list 确认至少两个 active 状态的 key ID;若仍失败,检查自定义仓库签名配置、删除 composer.lock 后重装,并确保 openssl.cafile/curl.cainfo 有效。

Composer 报错 “Signature verification failed” 怎么办
这是 Composer 在验证包签名时失败的明确信号,不是警告,是中断性错误。根本原因通常是本地 composer/ca-bundle 过期、composer.phar 自带的公钥库(keyring)陈旧,或系统 CA 证书不可信——不是网络问题,也不是包本身被篡改。
更新 Composer 内置密钥库的正确命令
Composer 从 2.5.0 起默认启用签名验证,其信任的公钥存放在内置 keyring 中,不走系统 CA。更新它不能靠 composer self-update,必须显式刷新:
- 运行
composer keys rotate:重置并拉取最新官方公钥(含 root 和 intermediate) - 紧接着执行
composer keys list确认输出中包含至少两个有效 key ID(如8F71A4E0B6C1B97C),且状态为active - 如果提示
Key rotation requires a valid internet connection,检查是否被代理/防火墙拦截了https://composer.github.io/keys.html
为什么 composer install 仍报签名失败
即使 keyring 已更新,以下情况仍会触发失败:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 项目
composer.json中启用了"minimum-stability": "dev"或引用了未签名的 fork 包(如git+https://...协议),这些绕过签名校验但会被 Composer 拒绝 - 使用了自定义仓库(
repositories),但该仓库未配置packagist.org兼容的签名机制 -
composer.lock里记录的包 hash 对应旧签名,需先删 lock 文件再composer install(仅限可信环境) - PHP 的
openssl.cafile或curl.cainfo指向了损坏的证书路径,导致无法安全连接 key 服务器
生产环境的安全配置建议
签名验证不能为了“能装上”就关掉。禁用 COMPOSER_DISABLE_XDEBUG_WARN 或设置 "secure-http": false 是危险操作。真正可控的做法是:
- 在 CI/CD 流水线中固定 Composer 版本(如
composer self-update 2.5.8),避免自动升级引入不兼容变更 - 用
composer config -g repo.packagist.org.allow_ssl_downgrade false强制 HTTPS,防止中间人劫持 - 定期运行
composer diagnose --strict,它会检查 keyring 有效期、CA 配置、HTTP 安全策略三项 - 私有仓库必须部署 Packagist Pro 或 Satis 并启用
signing-key,否则无法与公共生态签名链对齐
签名验证失效往往不是单一环节的问题,而是 keyring、网络 TLS 链、包源策略三者之一断开。优先查 composer keys list 输出和 composer diagnose 结果,比盲目删缓存或关安全开关更可靠。

















