composer install 默认校验 dist 包的 SHA-256 哈希(比对 composer.lock 中 dist.shasum)和 HTTPS 传输链(TLS 证书验证),不校验作者 GPG 签名;仅当显式启用 --verify-signatures 或配置 security.signature-verification 才验证 GPG 签名。

Composer 不校验包作者的 GPG 签名,除非你显式启用 --verify-signatures 或配置 security.signature-verification;默认只校验 composer.lock 中的 dist.shasum 和 HTTPS 传输链。
composer install 默认校验什么?
它不看 GPG,只做两件事:
- 比对远程 ZIP/TAR 包下载后计算出的 SHA-256 值,与
composer.lock中该包dist.shasum字段是否一致——不一致直接报Signature mismatch, package is corrupted - 强制走 HTTPS,并由
src/Composer/Util/TlsHelper.php校验 TLS 证书链;若证书不可信(如自签名、过期),连接会被中断 - 仅对
dist类型包生效;source(即git clone)完全跳过哈希比对,依赖 Git 自身完整性
这意味着:哪怕包作者上传了 GPG 签名,composer install 默认也当它不存在。
怎么启用真正的 GPG 包签名验证?
这个功能存在,但不是开箱即用,且只覆盖 dist 包:
- 确认 Composer ≥ 2.2:
composer --version - 全局启用:
composer config --global security.signature-verification true,或临时加参数:composer install --verify-signatures - 验证是否生效:改一个已签名包的
composer.lock中dist.shasum为错误值,再运行composer install --verify-signatures—— 应该报Missing signature for vendor/package而非单纯哈希错 - 注意:Packagist 页面上显示的 “Verified” 标签 ≠ 本地已校验;它只是说明作者上传时附带了签名,是否验,全看你配没配
为什么 composer verify-signature 命令不存在?
这是最常被搜错的点。官方从未提供该命令,所有声称能用它的教程或插件都不可信:
-
composer verify-signature是虚构命令,Composer v2.7.x 仍无此功能 - 第三方插件如
composer/composer-signature-checker已多年未维护,且内部用openssl_pkey_get_public,PHP 8.1+ 下直接报错 -
composer.json里写"signature": "xxx"字段会被 Composer 完全忽略 - 所谓“签名验证”,实际是
shasum+ HTTPS + (可选)packages.json元数据 GPG 验证三者组合,没有独立签名命令
真正要防投毒,必须开启 Packagist 元数据 GPG 验证
这不是校验包内容,而是校验你看到的包列表本身有没有被篡改——比如攻击者伪造 packages.json 把恶意包塞进搜索结果:
- 要求 Composer ≥ 2.2,且已设置
secure-http: true - 运行:
composer config --global signing-key https://packagist.org/keys.json - 生效标志:执行
composer update -vvv,日志中出现Verifying packages.json signature with key - 密钥由 Packagist 动态维护,如果某天他们轮换主密钥,旧版 Composer 可能因找不到对应公钥而拒绝加载索引
这步最容易被跳过,但它才是防御供应链投毒的第一道闸口——没它,composer require 拉下来的包名,连是不是 Packagist 官方收录的都说不准。


















