必须启用 secure-http 全局开关才能强制 Composer 使用 HTTPS,因为 repo.packagist.org 配置对官方源无效;执行 composer config -g secure-http true 后,HTTP 请求将被拒绝,但需确保系统 CA 证书完整且网络支持 HTTPS。

Composer 默认会走 HTTP 协议拉取包元数据(比如 packagist.org 的 packages.json),这存在中间人劫持风险;强制 HTTPS 是必须做的基础安全动作,不是可选项。
为什么 composer config -g repo.packagist.org 不起作用?
因为 Packagist 官方仓库在 Composer 2.0+ 中被硬编码为特殊处理对象,repo.packagist.org 这个配置项根本不会被读取——它只对自定义仓库生效。试图用这个命令覆盖官方源协议,纯属白忙活。
常见错误现象:
• 执行 composer config -g repo.packagist.org https://packagist.org 后,composer update 依然发出 HTTP 请求
• 抓包看到 http://packagist.org/packages.json 被访问
- 真正生效的配置是
secure-http全局开关 - 该设置强制所有仓库(包括 Packagist)必须使用 HTTPS,否则直接报错退出
- 它不修改 URL,而是加一层协议校验:只要响应头里
Location是 HTTP,就拒绝重定向
执行 composer config -g secure-http true 就够了吗?
够了,但要注意前提:你的网络环境必须能直连 https://packagist.org。国内部分企业网络或老旧代理会拦截或降级 HTTPS 请求,导致 composer update 卡住或报 cURL error 35(SSL handshake failed)。
- 如果遇到 SSL 错误,先验证能否手动访问:
curl -I https://packagist.org/packages.json - 若失败,别急着关
secure-http,优先检查系统 CA 证书(如 Ubuntu 需sudo apt install ca-certificates) - 某些旧版 Composer(secure-http,必须升级:
composer self-update - 该设置不影响已缓存的 HTTP 包(如本地
vendor/),只约束后续元数据拉取和包下载
如何确认 HTTPS 强制已生效?
最直接的办法是临时伪造一个 HTTP 响应,看 Composer 是否拒绝。但更实用的是观察实际请求行为:
- 启用调试模式:
composer update -vvv 2>&1 | grep "Downloading",输出中应只出现https://地址 - 检查全局配置:
composer config -g secure-http应返回true - 如果某次更新突然报错
The 'http://' URL '<code>http://packagist.org/p/xxx.json' is not allowed,说明生效了——这是预期行为,不是故障
真正容易被忽略的点是:这个设置只管「出站请求」,不管「入站来源」。如果你用私有仓库,得单独确保它的 URL 本身以 https:// 开头,secure-http 不会帮你自动补协议。另外,http:// 协议的自建 Satis 或 Private Packagist 实例,即使开了 HTTPS 强制,也会被直接拒掉——得先让服务端支持 HTTPS。










