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

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.url 是 http:// 开头,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.url为http://—— 这种组合会被新版 Composer 直接拒绝
最常被忽略的是签名头缺失和 CA bundle 更新滞后 —— 尤其当私有源部署在容器里,宿主机证书更新了,但容器镜像没重建,CA bundle 就还是旧的。










