composer install仅校验composer.lock中dist.shasum与下载zip/tar包解压前的sha-256值是否匹配,不匹配则中断并报错;同时强制https及tls证书验证,但不校验作者gpg签名或已安装vendor文件完整性。

composer install 时到底校验了什么
它只比对 composer.lock 里每个包的 dist.sha256 和你本地下载的 ZIP/TAR 包解压前的 SHA-256 值——不匹配就中断安装,报 Signature mismatch 或 package is corrupted。这不是“数字签名验证”,是哈希校验;不走 HTTPS、证书异常或中间人劫持,根本连不到校验环节。
常见错误现象:
- 改了
composer.lock中某包的shasum字段再运行composer install,却没报错 → 很可能用了缓存,或该包是source类型(如 Git 克隆),完全绕过校验 - 国内镜像源替换了原始 dist 包但保留了原哈希 → 校验通过,内容却已非作者发布
-
vendor/目录被手动修改后,composer dump-autoload或composer update都不会触发任何文件级完整性检查
如何启用 Packagist 元数据 GPG 验证(防仓库投毒)
这是目前唯一真正用到 GPG 的签名验证场景:校验 packages.json 是否由 Packagist 私钥签署,防止攻击者篡改包索引、注入恶意包链接。它不校验包体内容,但能守住“你看到的包列表”这道门。
必须满足以下条件才生效:
-
composer --version≥ 2.2.0(2026 年建议用 2.7.x) - 执行
composer config --global signing-key https://packagist.org/keys.json - 确保
secure-http: true(默认开启),且未设置disable-tls: true - 运行
composer install -v时日志中出现Verifying packages.json signature with key
注意:repo.packagist.org.allow_ssl_downgrade false 必须设为 false,否则签名验证会被降级跳过。
为什么 composer verify-signature 不存在
这个命令是虚构的。Composer 官方从未提供 composer verify-signature,所有声称支持它的教程、插件或脚本都不可信。第三方插件如 composer/composer-signature-checker 已多年未维护,在 PHP 8.1+ 下因调用废弃的 openssl_pkey_get_public 直接崩溃。
容易踩的坑:
- 在
composer.json里写"signature": "xxx"字段 → Composer 完全忽略 - 看到 Packagist 页面显示 “Verified” 就以为本地已验签 → 那只是作者上传时附带签名的记录,不代表你安装时做了验证
- 误以为
composer update --lock会重签名 → 它只更新时间戳,不生成或校验任何密码学签名
手动校验 vendor 文件完整性的现实路径
Composer 不提供运行时校验 vendor 目录的内置能力。想确认已安装包没被篡改,只能靠外部组合手段:
- 用
composer show --locked --format=json提取所有包的dist.url和dist.sha256 - 下载原始 ZIP,解压后计算目录哈希(注意排除
.git、tests/、vendor/bin/等非发布内容) - CI 中更实用的做法:用
tar -cf - vendor/ | sha256sum生成快照,与基线比对(需先清理vendor/composer/installed.json等动态文件) - 高敏感项目可配合
roave/security-advisories+composer audit拦截已知恶意版本,但它不替代文件级哈希比对
真正难的不是技术实现,而是确定“比对什么”:Composer 从不暴露它内部校验时用的目录结构和排除规则,所以手动复现 100% 一致的哈希几乎不可能。生产环境最可行的底线是:设 vendor/ 为只读、禁用自定义仓库、强制 --prefer-dist、并启用 Packagist 元数据 GPG 验证。











