Composer 2.0+ 默认启用 secure-http true,强制 HTTPS;设为 false 会引发中间人攻击风险;diagnose 报 FAIL 实为 PHP SSL 根证书配置错误,非开关问题。

composer config -g secure-http true 是默认行为,但容易被误关
Composer 2.0+ 默认强制启用 HTTPS,secure-http 配置项值为 true 时才允许访问 https:// 源;设为 false 会放行 http:// 源——这直接破坏 TLS 验证链,导致中间人攻击风险。很多人执行过 composer config -g secure-http false 来绕过证书错误,结果让所有镜像(包括阿里云、腾讯云)都退化为明文传输。
检查当前状态只需运行:composer config -g secure-http
- 输出
true:安全协议已启用(正常) - 输出
false或无输出:可能已被手动关闭,或配置未生效 - 若输出为空,不代表“未设置”,而是该配置继承自默认值(即
true),无需额外操作
为什么 composer diagnose 显示 secure-http: FAIL?
这不是配置开关的问题,而是底层 PHP 的 SSL/TLS 根证书缺失或路径错乱。即使 secure-http 是 true,只要 PHP 的 openssl 或 cURL 扩展无法验证服务器证书,就会报 SSL certificate problem: unable to get local issuer certificate 或 cURL error 60。
必须确认两件事:
- 运行
php -r "print_r(openssl_get_cert_locations());",盯住default_cert_file路径是否存在且非空 - 检查
php.ini中是否同时设置了openssl.cafile和curl.cainfo,且二者指向**同一个绝对路径**的cacert.pem - Windows 用户注意:路径中单反斜杠
是转义符,必须用正斜杠/或双反斜杠\
切镜像源不等于切协议,HTTPS 镜像也要校验证书
执行 composer config -g repos.packagist composer https://mirrors.aliyun.com/composer/ 确实启用了 HTTPS 镜像,但它只是把元数据请求(packages.json)代理过去,真正下载 ZIP 包仍走官方 CDN 或镜像提供的包地址。如果镜像站自身证书无效(如自签、过期、域名不匹配),一样会触发证书验证失败。
验证镜像是否真走 HTTPS:
- 运行
composer diagnose,看 “Repo:” 行是否以https://开头 - 抓包或加
-v参数(如composer update -v),观察实际请求 URL - 别信
https://前缀就以为安全——得看证书链能不能被 PHP 正确验证
临时禁用 secure-http 是高危操作,仅限调试
只有在明确知道目标源是可信内网 HTTP 服务(如私有 Packagist 实例)、且网络完全隔离时,才考虑关掉它。生产环境、CI 流水线、任何联网项目都不应设置 secure-http false。
如果你只是为了跑通安装而关了它,说明根本问题没解决——证书路径或 CA 文件才是症结。强行关掉只会掩盖 openssl.cafile 配置错误、cacert.pem 过期、或 PHP 加载了错误的 php.ini 这些真实缺陷。
最常被忽略的一点:Homebrew、Scoop、XAMPP 各自带的 PHP 可能加载不同 php.ini,改了一个地方,另一个地方还在用旧配置。务必用 php --ini 确认正在读哪个文件。


















