composer如何限制仅从可信源安装包?(secure-http与custom CA配置)

1次阅读

composer报该错误是因为secure-http=true时,http镜像未正确转发x-content-signature签名头导致校验失败;应换用支持签名的https镜像(如阿里云),或临时禁用secure-http(不推荐)。

composer如何限制仅从可信源安装包?(secure-http与custom CA配置)

composer install 为什么报 “The contents of https://packagist.org/packages.json do not match its signature”?

这是 Composer 强制启用 secure-http 后,对 HTTP 源(包括镜像)做完整性校验失败的典型表现。Packagist 官方源已强制 HTTPS,但如果你配置了国内镜像(如 https://packagist.phpcomposer.com 或旧版 http://packagist.org),而该镜像未正确实现签名转发或证书链不完整,就会触发这个错误。

根本原因不是网络问题,而是 Composer 在 2.0+ 默认开启 secure-http = true,要求所有包元数据必须通过 HTTPS 加载,且响应需带有效签名头(X-Content-Signature)。非官方镜像若未同步签名逻辑,就无法通过校验。

  • 检查当前配置:composer config --global secure-http —— 输出 true 即启用
  • 临时绕过(仅调试):composer config --global secure-http false,但不推荐长期使用
  • 优先换用支持签名的镜像:如阿里云镜像 https://mirrors.aliyun.com/composer/(确认其响应含 X-Content-Signature

如何让 Composer 信任私有仓库或自建 Packagist 的自签名证书?

当你用 composer require 拉取内部 gitlab 或私有 Packagist 时,如果服务端用的是自签名 CA 或内网 CA 签发的证书,Composer 默认会拒绝连接,并报错类似:curl Error 60: ssl certificate problem: unable to get local issuer certificate

不能靠关掉 verify-peer(已废弃),也不能改系统 OpenSSL 配置 —— Composer 使用自己的 CA bundle,路径由 openssl.cafile 或环境变量 COMPOSER_CAFILE 控制。

  • 把你的自建 CA 证书(PEM 格式)追加到 Composer 默认 CA 文件里:cat my-ca.crt >> $(php -r "echo openssl_get_cert_locations()['default_cert_file'];")
  • 或指定独立 CA 文件:composer config --global cafile /path/to/my-ca.crt
  • 验证是否生效:composer config --global cafile,再运行 composer diagnose 查看 “CA file” 行是否显示你指定的路径

为什么设置了 secure-http = true 还能装到 HTTP 包?

因为 secure-http 只约束「元数据源」(即 repositories 中的 packagist.org 或自定义 type: composer 源),不约束包实际下载地址(dist.url)。也就是说,即使你禁用了 HTTP 元数据源,只要某个包的 dist.urlhttp:// 开头,Composer 仍可能去下载 —— 这在 2.2+ 已被默认阻止,但老版本或某些插件绕过时仍存在风险。

  • 检查包实际下载协议:composer show vendor/package --verbose,关注 dist.url 字段
  • 全局禁止 HTTP 下载(推荐):composer config --global disable-tls false(注意:这不是开关 TLS,而是控制是否允许非 HTTPS dist;设为 false 才真正禁用 HTTP dist)
  • 更彻底的方式:在 composer.json 里显式声明只接受 HTTPS dist:"config": {"secure-http": true, "disable-tls": false}

自建私有源时,哪些配置项直接影响可信链验证?

如果你运营一个私有 Packagist(如 Satis 或 private Packagist),客户端能否信任它,取决于三个关键点是否对齐:证书有效性、签名头完整性、以及 Composer 客户端是否识别该源为“可信”。

  • 证书必须被客户端 CA bundle 认可 —— 不是“浏览器能打开就行”,而是要进 cafile 或系统 OpenSSL store
  • 必须返回 X-Content-Signature 响应头(Satis 1.0+ 自动支持;老版本需手动 patch 或升级)
  • 私有源类型必须是 composer,且 URL 以 https:// 开头;用 vcs 类型时,secure-http 不起作用,校验逻辑完全不同
  • 避免混用协议:不要在 repositories 里写 https://myrepo.com,但在它的 packages.json 里返回 dist.urlhttp:// —— 这种组合会被新版 Composer 直接拒绝

最常被忽略的是签名头缺失和 CA bundle 更新滞后 —— 尤其当私有源部署在容器里,宿主机证书更新了,但容器镜像没重建,CA bundle 就还是旧的。

text=ZqhQzanResources