composer不校验私有包gpg签名,仅依赖dist.shasum;私有包可信需在composer流程外手动集成gpg--verify验签,覆盖下载前或解压前环节。

Composer根本不校验私有包的GPG签名
Composer没有内置机制去验证你私有仓库里某个 .zip 或 .tar.gz 包是否带 GPG 签名,也不检查签名是否有效。它只认 composer.lock 里的 dist.shasum——哪怕你手动给包加了 .asc 文件,Composer 安装时也完全无视。
常见错误现象:composer install 成功,但私有包实际被镜像源或中间代理替换过;或者你用 "type": "package" 直接指定 URL 下载,dist.shasum 字段为空或被忽略,校验直接跳过。
- 私有仓库(如 Satis、Private Packagist、自建 Artifactory)若未主动提供并同步
repomd.xml.asc类元数据签名,Composer 就无从验证索引真实性 - 即使你把 GPG 公钥导入系统,
gpg --verify package.zip.asc package.zip能手动验签,但 Composer 不调用这个流程 -
composer config --global signing-key只对 Packagist 元数据生效,对私有源无效;私有源需自行实现签名+验证逻辑
私有包 GPG 校验必须自己动手,且得在 Composer 流程外做
想让私有依赖真正可信,得把 GPG 验签嵌进下载前或解压前环节,不能依赖 Composer 默认行为。典型做法是:用脚本拦截 pre-install-cmd 或 post-package-install,对 dist.url 对应文件做 gpg --verify。
使用场景:CI/CD 构建阶段强制验签、审计环境离线比对、高安全等级项目上线前二次确认。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 先确保私有包发布时附带
.asc文件(例如mylib-1.2.0.zip.asc),且公钥已导入本地密钥环:gpg --import myorg.pub.asc - 在
composer.json中定义脚本钩子:"scripts": {"pre-install-cmd": "scripts/verify-dist-signatures.php"} -
verify-dist-signatures.php需解析composer.lock,提取每个私有包的dist.url和预期dist.shasum,再下载.asc并调用gpg --verify;失败则exit(1) - 注意路径权限:脚本需能访问
~/.composer/cache/files/缓存目录,否则要先清缓存或强制--no-cache
私有源元数据 GPG 签名验证 ≠ 包体签名验证
给私有仓库的 packages.json 或 repomd.xml 加 GPG 签名,只能防“索引投毒”——比如攻击者篡改包列表,把恶意版本混进去。但它不保证列表里指向的那个 .zip 文件本身没被换掉。
参数差异明显:packages.json.asc 验证的是“谁发布了这个版本列表”,而 mylib-1.2.0.zip.asc 验证的是“这个压缩包确实是发布者亲手打包并签名的”。两者密钥可以不同,信任链也独立。
- 若私有源用 Satis,需在生成阶段启用
--sign参数,并配置GPG_TTY和GNUPGHOME环境变量 - 验证端需提前导入对应公钥到
/usr/share/keyrings/,并在 Composer 配置中显式指定密钥路径:composer config repo.my-private.type composer && composer config repo.my-private.packages-json-signing-key /usr/share/keyrings/myorg.gpg - 当前 Composer 版本(≥2.9.6)仍不支持为任意私有源自动拉取和轮换密钥;
keys.json机制仅限 Packagist 官方源
缓存、镜像、source 类型会彻底绕过所有校验
哪怕你设好了 GPG 验签脚本,只要用了以下任一方式,整个信任链就断了:缓存命中、国内镜像源、--prefer-source、"type": "vcs" 或本地 "type": "path"。
性能影响很实际:每次安装都重下 .zip + .asc 并验签,会拖慢 CI 构建;但安全和速度之间,这里没有折中——要么接受风险,要么承担开销。
-
~/.composer/cache/files/下的 zip 文件若被提前污染(比如人工替换),后续composer install默认复用,你的验签脚本根本不会触发 - Git 仓库类依赖(
"type": "vcs")完全不走 dist 流程,dist.shasum字段为空,GPG 验签脚本无字段可读,只能退回到git verify-tag手动操作 - 很多私有镜像(如腾讯云、阿里云 Composer 镜像)不转发
.asc文件,或返回 404;这时gpg --verify直接失败,不是配置问题,是镜像本身不支持










