composer 2.2+ 默认强制启用 secure-http,拒绝所有 http 协议仓库;必须将私有源或镜像升级为 https,确保 tls 证书有效,且 openssl ≥1.1.1,禁用 --no-secure-http 等临时方案。

报错“secure-http is disabled”或“Invalid protocol”
这是 Composer 2.2+ 默认强制启用 secure-http 的直接表现——它拒绝访问任何非 HTTPS 的仓库地址,哪怕你本地 composer.json 里写了 http:// 协议的私有源,也会被拦截并报类似 Invalid protocol: http 或提示 secure-http is disabled(实际是被拒绝而非“已禁用”)。
别改 PHP 配置或系统证书,这不是 SSL 错误;也别信网上搜到的“加 --no-secure-http 就行”,这个参数只影响是否允许 仓库本身 用 HTTP,不解决协议校验失败问题。
- 先确认出问题的是哪个源:运行
composer config -g repo.packagist看全局镜像,再查项目级配置composer config repo.packagist,优先级是项目 > 全局 - 阿里云、腾讯云等国内镜像已全量停用 HTTP,必须用
https://mirrors.aliyun.com/composer/—— 注意结尾无斜杠,且协议必须是https - 私有 Satis 或 Private Packagist 源,必须确保其域名有有效 TLS 证书;自签名证书不行,Composer 不走 PHP 的
ssl.certificate_authority配置 - 临时调试可设
composer config -g secure-http false,但仅限内网可信环境,且要配合composer clear-cache生效
为什么 --no-secure-http 不起作用?
因为 --no-secure-http 只关闭“是否允许 HTTP 协议仓库”的策略检查,而你的报错实际来自底层 cURL 或 stream 的协议协商失败——比如服务端只支持 TLS 1.3,但你的 PHP OpenSSL 版本太旧,连握手都完成不了。
典型现象:composer install --no-secure-http 仍卡在 Resolving dependencies through SAT 或直接报 cURL error 1(unsupported protocol)。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 验证真实协议能力:运行
php -r "print_r(stream_get_wrappers());",确认https在列表中 - 检查 OpenSSL 版本:
php -v和php -m | grep openssl,PHP 8.0+ 推荐搭配 OpenSSL 1.1.1+;CentOS 7 默认 OpenSSL 1.0.2 已被主流镜像拒绝 - 临时绕过协议限制(仅调试):
COMPOSER_NO_SSL=1 composer install,它会跳过整个 TLS 层,但风险极高,切勿用于公网环境
私有源用了 HTTP 协议,怎么安全迁移到 HTTPS?
内部 GitLab 或 Nexus 搭建的私有源若仍用 HTTP,不能硬加 --no-secure-http 上线,否则 CI/CD 流水线随时可能中断。正确路径是让私有源自己支持 HTTPS,而非让 Composer 降级适配。
- 最轻量方案:用
nginx前置反代,监听 443,后端仍走 HTTP,证书用 Let's Encrypt 或公司内网 CA 签发 - 避免用自签名证书:Composer 不读取系统 ca-certificates,也不认
openssl.cafile,必须把证书链拼进 nginx 的ssl_certificate文件 - 更新 Composer 配置:
composer config repositories.my-private-repo.type composer,然后composer config repositories.my-private-repo.url https://your-private-repo.example.com - 验证是否生效:
composer show -p应列出该源,且 URL 显示为https
CI/CD 中遇到 secure-http 报错,怎么写才稳?
流水线里一旦出现协议错误,往往不是配置写错,而是构建镜像里的 PHP 或 OpenSSL 版本太老,或者缓存了旧的全局配置。
- 标准做法:在
.gitlab-ci.yml或GitHub Actions中显式重置镜像源:composer config -g repo.packagist https://mirrors.aliyun.com/composer/ - 加一步清缓存:
composer clear-cache,否则旧的 HTTP 源记录还在,install 时仍会尝试连接 - 禁止使用
--ignore-platform-reqs或--no-secure-http,它们掩盖的是基础环境缺陷,不是临时 workaround - 关键检查点:在 CI 脚本开头加
php -r "echo OPENSSL_VERSION_TEXT;",确认 OpenSSL 版本 ≥ 1.1.1
真正麻烦的不是协议开关本身,而是它暴露了长期被忽略的底层依赖老化问题——比如 PHP 镜像没升级、CI runner 复用旧缓存、私有源运维停滞。修复一次,比每次加 flag 更省事。










