Composer强制HTTPS(TLS)是为防止依赖元数据被中间人篡改或注入恶意包,Packagist官方源在Composer 2.0+中硬编码强制HTTPS,HTTP请求会被重定向并因secure-http=true直接报错;cafile和curl.cainfo仅控制TLS证书链验证,不干预协议选择。

Composer 必须用 SSL(更准确说是 TLS)不是为了“锦上添花”,而是防止你在安装依赖时被中间人篡改元数据或注入恶意包——packages.json 被劫持一次,整个项目就可能引入后门。
为什么 packagist.org 的 HTTP 请求会被拒绝?
因为 Packagist 官方源在 Composer 2.0+ 中被硬编码为强制 HTTPS 场景。即使你手动写 http://packagist.org,Composer 也会重定向;而一旦重定向目标是 http://(比如代理降级),secure-http 开关就会直接报错退出,不给你任何妥协余地。
-
secure-http不是“建议用 HTTPS”,而是“HTTP 就是非法协议” - 这个校验发生在元数据拉取阶段(如
packages.json、provider-latest.json),不是包文件下载阶段 - 它不关心证书是否有效,只检查 URL 协议头和重定向链——这是和
disable-tls的根本区别
curl.cainfo 和 cafile 配置到底管什么?
它们只影响 TLS 握手时的证书链验证,即“这个 HTTPS 网站是不是真的”。如果系统缺少根证书(比如 Ubuntu 未装 ca-certificates),或 PHP 没配 curl.cainfo,Composer 就可能卡在 SSL handshake failed(cURL error 35),甚至悄悄回退到 HTTP(若 secure-http 关闭)。
- 正确做法:运行
curl -I https://packagist.org/packages.json验证底层网络是否通 HTTPS - 再查
php -r "print_r(openssl_get_cert_locations());"看 PHP 认的证书路径 - 最后用
composer config --global cafile /etc/ssl/certs/ca-certificates.crt显式指定(路径依系统而定)
COMPOSER_DISABLE_NETWORK_FALLBACK=1 真的必要吗?
有必要,但仅当你的私有仓库或镜像存在 HTTPS 不稳定风险时。这个环境变量关闭的是“HTTPS 失败 → 自动试 HTTP”的兜底逻辑。没有它,哪怕 secure-http=true,只要某个镜像返回 5xx 或超时,Composer 仍可能降级走 HTTP——尤其在老旧企业代理环境下。
- 设了它之后,任何 HTTPS 连接失败都会立即报错,不会沉默降级
- 它不影响
secure-http对协议的拦截,两者是正交控制:一个管“是否允许 HTTP”,一个管“是否允许跳过 HTTPS” - CI/CD 流水线中强烈建议启用,避免因网络抖动引入不安全通道
真正容易被忽略的是:这些配置只约束“出站请求”,对已缓存的 HTTP 包(比如早年 vendor/ 里混进来的旧包)完全无感。安全不是配一次就一劳永逸,得配合定期 composer audit 和锁文件更新来闭环。











