composer 不校验包签名,“signature mismatch”实为 dist.sha256 哈希比对失败,源于下载包与 composer.lock 记录值不一致;它无 pgp/gpg 验签能力,verify-signature 命令不存在,唯一离线校验方式是 composer_experimental=1 composer verify-checksums --strict。

Composer 本身不校验包签名,“无效签名”提示基本是误报或配置错位——它没有 PGP/GPG 签名校验能力,所谓“签名”通常指 dist.sha256 哈希比对失败,而非密码学签名验证。
composer install 报 “Signature mismatch, package is corrupted” 怎么回事
这是 Composer 在 install 或 update 过程中发现下载的 zip/tar 包哈希值与 composer.lock 中记录的 dist.sha256 字段不一致时抛出的标准错误。它和“数字签名”无关,只是文件完整性校验失败。
- 常见触发场景:国内镜像源替换了原始 dist 包但没更新哈希值;本地缓存(
~/.composer/cache/files/)被手动修改过;网络中断导致 zip 下载不全 - 不会出现在
--prefer-source场景下——因为 git clone 完全跳过哈希校验 - 若
composer.lock里某包缺失dist.sha256字段(如老旧包、私有源),该包直接跳过校验,也不会报这个错
为什么 composer verify-signature 命令不存在
这个命令从未被 Composer 官方实现过。搜索到的教程或插件(如 composer/composer-signature-checker)均非官方维护,且已多年未更新,PHP 8.1+ 下因 openssl_pkey_get_public 废弃而彻底失效。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
composer.json中写"signature": "xxx"字段会被完全忽略 - Packagist 内部确实用 GPG 对上传包做签名,但该机制不向用户端暴露,也不参与 Composer 的任何校验流程
- 所谓“启用签名验证”,比如
composer config -g security.signature-verification true,只对极少数明确声明支持签名的官方包(如 Laravel)起作用,且仍是实验性、非默认行为
composer verify-checksums --strict 是唯一可行的离线校验方式
这是 Composer 2.5+ 提供的唯一能真正比对已安装 vendor 文件与 composer.lock 中哈希值的命令,但它必须显式启用实验模式,且默认不激活。
- 必须加环境变量:
COMPOSER_EXPERIMENTAL=1 composer verify-checksums --strict,缺一不可 -
--strict很关键:不加则校验失败也返回 0(CI 会误判为成功) - 它只校验 dist 包发布的原始文件结构,自动排除
.git、tests/、vendor/composer/autoload_*.php等非发布内容 - 若某包在
composer.lock中无dist.sha256(如"type": "package"或 path 源),该包被静默跳过,不报错也不警告
vendor/autoload.php 被篡改后,所有校验都失效
vendor/autoload.php 是个固定引导文件,内容仅为 require_once __DIR__ . '/composer/autoload_real.php';。它被恶意替换(例如注入 eval($_GET['x']))后,composer dump-autoload、verify-checksums、甚至 audit 全部无感——因为它不在任何哈希或安全扫描链路中。
- 防护只能靠外部手段:生产环境设
chmod -R a-w vendor/;CI 中加grep -q "autoload_real\.php" vendor/autoload.php || exit 1 -
composer.lock和installed.json都不记录该文件的哈希,它的完整性完全游离于 Composer 校验体系之外 - 真正危险的是运行时加载——一旦入口被污染,后续所有 autoload 映射都会在恶意上下文中执行










