composer install 默认不校验包作者GPG签名和Packagist元数据GPG签名;必须手动启用security.signature-verification和security.signature配置,否则仅靠HTTPS+SHA256只能防传输篡改,无法防仓库投毒或恶意包。

composer install 默认不校验包作者签名,也不强制验证 Packagist 元数据签名——这两层才是防供应链投毒的关键。必须手动开启,否则 HTTPS + SHA256 校验(dist.shasum)只能防传输篡改,防不了仓库被污染或包本身恶意。
怎么确认 signature verification 是否生效
运行 composer diagnose,只看两行输出:
-
secure-http: OK—— 表示所有源都走 HTTPS,没被降级 -
signature verification: OK—— 表示 Packagist 的packages.json正在被 GPG 验证(Composer ≥ 2.2)
任一为 FAIL 或缺失,说明签名链已断。常见原因:repositories 字段存在(哪怕空数组)、COMPOSER_REPO_PACKAGIST 环境变量覆盖、或执行过 composer config --global repo.packagist composer http://...。
启用元数据签名验证(防仓库投毒)
这是最常漏掉的一环:Packagist 官方源返回的 packages.json 带 signature 字段,但 Composer 不默认验它。
- 全局启用:
composer config --global security.signature true - 确保源仍是官方地址:
composer config --global repos.packagist.type composer,再设repos.packagist.url为https://packagist.org(不是镜像) - 若要用镜像加速元数据请求(如阿里云),必须用
repos.packagist子键,而非repo.packagist—— 后者会直接替换源,跳过签名 - 验证方式:
composer show monolog/monolog | grep -i signature,有输出即表示元数据加载时已验签
包作者签名验证(防包投毒)
这层验证针对具体包的 dist 文件(.zip/.tar.gz),由作者上传时附带 GPG 签名,但 Composer 默认关闭。
- 查当前状态:
composer config --global security.signature-verification,返回true才生效 - 临时启用:
composer install --verify-signatures,失败时明确报Signature mismatch或Missing signature - 注意:只校验
dist方式下载的包,source(git clone)不参与;dev-分支也无签名,别用 - 生产 CI 中建议固定加参数:
composer install --verify-signatures --no-interaction --no-dev --prefer-dist
为什么镜像源配置容易导致安全失效
执行 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ 看似合理,实则危险:
- 该操作把官方源整个替换成镜像,而阿里云等镜像不转发
signature字段 → Composer 自动 fallback 到无签名验证模式 - 镜像站若被污染(缓存投毒),你拉下的
packages.json就是攻击者伪造的,后续所有包下载都不可信 - 真正安全的镜像用法是:保留
repos.packagist.url = https://packagist.org,仅对元数据请求走 HTTPS 镜像代理(需镜像支持X-Original-URL头) - 目前仅少数镜像(如腾讯云新版)同步 signature 字段;不确定时,宁可不用镜像,也要保签名
签名验证不是“开了就万事大吉”,它依赖两个独立环节:元数据(packages.json)签名 + 包文件(dist)签名。任一缺失,供应链信任链就断了一环。很多团队只配了 secure-http 和 shasum,却漏掉这两层 GPG 验证,等于给门装了锁却忘了关窗。


















