Composer默认不校验包签名,仅依赖HTTPS和Packagist人工审核;真要防篡改,必须手动启用security.signature-verification并严格配置GPG密钥、签名文件及时间同步,三者缺一不可。

Composer 默认不校验包签名,所有“可信分发”都建立在 HTTPS + Packagist 人工审核的脆弱假设上;真要防篡改,必须手动启用并严格配置 composer-signature 验证机制。
为什么 composer install 从不报签名错误?
因为 Composer 2.2+ 虽内置签名支持,但默认完全关闭——既不下载签名文件,也不校验哈希或 GPG 签名。Packagist 上绝大多数包根本没上传 composer.lock 对应的 .sig 文件,composer install 就当它不存在。
- 检查是否启用:运行
composer config --global security.signature-verification,返回false是默认状态 - 启用后,Composer 会强制要求每个包提供
dist.signature字段(来自packages.json),缺失即中止安装 - 即使启用了,若包作者没用
composer archive打包并签名,验证环节直接跳过——不是失败,是静默绕过
如何让自己的包真正可被签名验证?
光在 composer.json 里写 "type": "library" 没用。签名必须由发布者本地生成,并随 dist 包一起提交到仓库。
- 打包前先生成密钥对:
gpg --full-generate-key,记住 key ID(如ABC123DEF456) - 用私钥签名归档:
composer archive --format=zip --signature=ABC123DEF456 my-package - 确保
composer.json中包含"archive": {"exclude": [".git", "tests"]},否则签名可能覆盖不完整 - 上传 zip 到 GitHub Release 后,在 Packagist 的包设置页勾选 “Enable signature verification”,并填入公钥指纹
composer update 卡在 “Verifying signature” 却无日志?
这是最易误判的坑:Composer 不会输出具体哪一步失败,只卡住或抛出模糊的 InvalidSignatureException。实际原因往往和网络、时间、密钥格式强相关。
- 系统时间偏差 > 5 分钟会导致 GPG 验证直接拒绝——检查
date输出,同步 NTP - 公钥未导入 GPG keyring:
gpg --import public-key.asc,且必须用--homedir指向 Composer 使用的 GPG 目录(默认~/.gnupg) - GitHub Packages 等私有源需额外配置
repositories中的"options": {"http": {"header": ["Authorization: Bearer ..."]}},否则.sig文件 404 导致验证中断 - 签名文件路径必须严格匹配:
https://example.com/dist/my-pkg-1.2.3.zip.sig,少一个.sig后缀或大小写错误,就静默失败
签名验证不是开关一开就自动生效的防护层,它依赖发布者持续签名、使用者正确导入公钥、分发平台完整托管 .sig 文件——三者缺一不可。任何一环用默认值、跳过步骤或忽略错误日志,整条链就退化回 HTTP 下载。


















