签名验证失败是因本地composer.lock中记录的dist.sha256或签名与镜像源返回的元数据不一致;需同步删除vendor和composer.lock,禁用镜像后用--no-cache --force-checksums强制重装,再择机切回稳定镜像源。

签名验证失败不是包被篡改,而是 Composer 拿本地 lock 文件里记的 dist.sha256 或签名值,去比对镜像源返回的包元数据——两者对不上,就直接报错。
为什么切回官方源就正常
国内镜像(阿里云、腾讯云、华为云)存在同步延迟或元数据精简行为:
– 新 tag 发布后,镜像没及时更新 dist.sha256 字段
– 部分镜像主动删掉 autoload 字段或签名证书以压缩响应体
– CDN 中间层可能修改 HTTP 响应 body,破坏签名完整性
这些都不是网络丢包,而是镜像“没同步全”,导致你本地 composer.lock 里存的哈希和实际下载内容不一致。
只清缓存或只删 vendor 都没用
常见错误操作:
– composer clear-cache 只删下载包,composer.lock 里旧哈希还在
– rm -rf vendor 后直接 composer install,仍会拿旧哈希去校验新包
必须同步清理两个东西:
– 删除 vendor/ 目录
– 删除 composer.lock 文件
– 运行 composer config -g --unset repos.packagist 临时禁用镜像
– 再执行 composer config -g repo.packagist composer https://packagist.org 切回官方源
重装时必须加 --force-checksums
否则 Composer 会跳过校验,继续用缓存或旧逻辑,问题照旧:
– 先确保已禁用镜像、删干净 vendor 和 composer.lock
– 运行 composer install --no-cache --force-checksums
– 成功后生成新 composer.lock,再决定是否换回镜像(建议等 30 分钟,或换华为云)
离线环境还要额外加 COMPOSER_DISABLE_NETWORK=1,否则校验阶段仍会尝试联网确认包元数据。
插件类包特别容易中招
type: composer-plugin 的包对签名更敏感,因为插件加载依赖完整签名链:
– 即使校验通过,也要检查 composer.json 里是否有 "allow-plugins": ["vendor/name"](大小写敏感,不可用通配符)
– 若没声明,插件会被 Composer 2.2+ 默认拦截,看似安装成功,实则静默失效
– composer install --no-plugins 能绕过插件加载,但不能解决签名本身的问题
真正卡点往往不在命令本身,而在镜像同步滞后与 lock 文件残留的组合效应——删锁文件前不切源,重装时不用 --force-checksums,几乎必然复现。


















