secure-http 必须设为 true 才强制 HTTPS;默认启用,但若显式设为 false(全局/项目级/环境变量),则允许不安全的 HTTP 源,易遭中间人攻击。

secure-http 配置项必须设为 true 才强制 HTTPS
Composer 默认启用 secure-http,即拒绝所有 HTTP 协议的仓库源;但一旦项目或全局配置中显式设为 false,它就会允许 HTTP 源接入,带来中间人攻击风险。你看到包能装上却报 warning 或直接失败,往往是因为某处悄悄关掉了这个开关。
检查是否被关闭:运行 composer config --list | grep secure-http,如果输出是 secure-http=false,说明当前作用域(项目级或全局)已禁用 HTTPS 强制策略。
- 全局关闭影响所有项目:执行过
composer config --global secure-http false就会如此 - 项目级关闭只影响当前目录:在项目根目录下运行
composer config secure-http false会写入composer.json的config段 - PHP 环境变量或命令行参数也能覆盖:如
COMPOSER_SECURE_HTTP=0 composer install会临时绕过
为什么设了 secure-http=true 还出现 HTTP 源警告?
因为 Composer 不仅检查仓库 URL 协议,还会验证其重定向行为。比如你配了 https://mirrors.aliyun.com/composer/,但该镜像站内部 302 跳转到了 http://xxx 地址,Composer 仍会报 Warning: Accessing xxx over http which is an insecure protocol。
这类问题常见于老旧镜像或自建 Satis 服务未正确配置 TLS 终止点。解决方式不是关 secure-http,而是修复跳转链路或换用真正全链路 HTTPS 的镜像(如腾讯云、阿里云官方镜像均无此问题)。
- 验证真实请求协议:加
-v参数运行composer update -v,观察日志中Downloading https://...是否始终为https - 私有仓库若走 HTTP 内网地址(如
http://gitlab.internal),必须配合"secure-http": false,但仅限可信内网,且不能与公网源混用 -
secure-http对vcs类型仓库(如git@或https://Git 地址)不生效——它只约束composer类型仓库的元数据接口
私有仓库用 HTTP 时如何避免报错又不降安全等级?
唯一合规做法是:在项目级明确关闭 secure-http,同时确保该仓库完全隔离、不引入任何公网依赖。不要试图用 http-proxy 或改 DNS 来“伪装” HTTPS——Composer 在建立连接前就已解析并校验协议。
操作示例(仅限可信内网):
composer config secure-http false
这会在当前项目 composer.json 的 config 字段写入:"secure-http": false。注意这不是全局设置,不会污染其他项目。
- 必须同步声明仓库类型为
vcs或path,而非composer:HTTP 源无法提供安全的packages.json接口,composer类型仓库硬性要求 HTTPS - 若误将内网 GitLab 地址配成
"type": "composer", "url": "http://gitlab.internal",即使关了secure-http,也会报Invalid repository type - GitLab/GitHub 私有库应始终用
https://+github-oauth/gitlab-oauth,这是比关secure-http更安全的选择
secure-http 关闭后,为什么 composer install 还卡在 Loading repositories?
大概率是代理没配对。关了 secure-http 并不等于跳过 TLS 校验——HTTP 请求仍需走通网络,而很多企业环境只放行 HTTPS 出口,或 DNS 不解析内网 HTTP 域名。
此时错误现象和 HTTPS 场景高度相似,但原因完全不同:不是证书问题,而是根本连不到那个 HTTP 地址。排查优先级应是:
- 用
curl -I http://your-private-repo/packages.json直接测试能否拿到 200 响应 - 确认 PHP 进程可解析该域名(
php -r "var_dump(gethostbyname('gitlab.internal'));") - 检查是否误启用了
http-proxy但没配https-proxy:HTTP 请求会走代理,但若代理不可达,一样卡住
最常被忽略的是:关 secure-http 是个安全降级动作,它本身不解决连通性问题,只是让 Composer 允许你把问题暴露在更底层的网络环节。


















