答案是离线时报SSL错误说明COMPOSER_DISABLE_NETWORK=1未生效,根本原因在于网络未真正切断;需检查全局镜像、代理、repositories配置及插件干扰,而非证书设置。

离线服务器上配置 Composer “忽略根证书”是典型误解——COMPOSER_DISABLE_NETWORK=1 已切断所有网络请求,此时根本不会触发 SSL 验证;若仍报 cURL error 60 或 SSL certificate problem,说明 Composer 还在联网,不是证书问题,而是离线开关没生效或被绕过。
为什么设了 COMPOSER_DISABLE_NETWORK=1 还报 SSL 错误?
这几乎可以断定:Composer 并未真正进入离线模式。常见原因包括:
-
COMPOSER_DISABLE_NETWORK=1没在命令执行前生效(如 Windows PowerShell 中漏写$env:前缀) - 全局配置残留了镜像源:
composer config --global repo.packagist返回非false,导致 fallback 连接 - 项目级
composer.json里写了"repositories"且 URL 是 HTTPS,COMPOSER_DISABLE_NETWORK=1下会直接报错退出,不走证书校验流程 - 用了插件(如
phpstan/extension-installer),它在--no-plugins外部发起 HTTP 请求
ssl.cafile 在离线环境完全无效
这个配置只影响 Composer 发起的 HTTPS 请求(比如访问私有仓库),但前提是网络未被禁用。一旦 COMPOSER_DISABLE_NETWORK=1 生效,所有远程请求(含证书验证环节)都被跳过,ssl.cafile 根本不会被读取。
如果你已在离线机看到 SSL 报错,说明:
- 你没设
COMPOSER_DISABLE_NETWORK=1,或者设了但没生效 - 你误以为“断网 = 离线”,而 Composer 不会自动降级
- 你试图用
composer config --global secure-http false或cafile来“解决”问题,但这对离线模式无意义
离线场景下真正要检查的三处配置
不是证书,是网络通路是否彻底关闭:
- 运行
composer config --global repo.packagist,输出必须是false;如果不是,执行composer config --global repo.packagist false - 确认没有全局
http-proxy或https-proxy配置:composer config --global --list | grep -E "(proxy|http)",有就unset - 检查
composer.json顶层是否有"repositories"字段,且其中任意url是 HTTPS 协议——这种配置在离线时无法兜底,必须删掉或改用type: "path"
最常被忽略的一点:离线模式下,composer install 的行为完全由 composer.lock 和本地 vendor/ 决定,跟证书、CA、镜像源都无关。只要网络开关没关死,错误就永远在“联网失败”层面,而不是“证书失败”层面。


















