Composer正常拉取关闭匿名访问的Nexus HTTPS仓库须同时满足:Nexus启用可信HTTPS、Composer配置带认证的https://仓库URL、且https-proxy(如需)已正确设置;缺一则报错或卡住。

Composer 要正常拉取 Nexus 上的 HTTPS 协议仓库(尤其是关闭了匿名访问的 Nexus),必须同时满足三个条件:Nexus 启用了 HTTPS、Composer 配置了带认证的仓库 URL、且 https-proxy(如需)已正确设置。缺一不可,否则会卡在 Loading composer repositories 或报 refusing to pass credentials to insecure URL。
为什么 Composer 无法直连 HTTP 协议的 Nexus 仓库
当 Nexus 关闭匿名登录后,Composer 会尝试发送认证头(Authorization: Basic ...)。但 Go 生态(如 go mod)和部分 Composer 版本会主动拒绝向 HTTP 地址发送凭证——这是安全策略,不是 bug。Nexus 必须监听 HTTPS(比如 https://nexus.example.com:8443),且证书可被系统信任(或通过 composer config --global disable-tls false 强制校验,不推荐绕过)。
常见错误现象:
-
Could not fetch https://nexus.example.com/repository/composer/...: failed to open stream: Connection refused→ Nexus HTTPS 未启用或端口不通 -
refusing to pass credentials to insecure URL→ Composer 检测到 URL 是http://,拒绝发 auth 头 -
SSL certificate problem: unable to get local issuer certificate→ 自签名证书未导入系统 CA 或未配置openssl.cafile
如何在 Composer 中配置 Nexus HTTPS 仓库(含认证)
假设 Nexus 已启用 HTTPS(端口 8443),且你有账号 devuser 密码 devpass,仓库地址为 https://nexus.example.com:8443/repository/composer-private/。
执行以下命令(注意:URL 必须以 https:// 开头,不能用 http://):
composer config --global repositories.nexus-private '{"type":"composer","url":"https://nexus.example.com:8443/repository/composer-private/"}'
composer config --global http-basic.nexus.example.com:8443 '{"username":"devuser","password":"devpass"}'
关键点:
-
http-basic的 key 是域名+端口(不含协议),不是完整 URL;Composer 会自动匹配请求 Host - 如果 Nexus 使用非标准端口(如 8443),必须显式写入 key 中,否则认证头不会发出
- 不要用
composer config --global github-oauth类机制,那是 GitHub 专用的 - 若仓库是 Group 类型(聚合了 hosted + proxy),确保该 Group 本身也启用了 HTTPS 访问
代理环境下的额外配置(HTTPS 请求必配)
如果你在企业内网走代理,只配 http-proxy 不够——Composer 对 HTTPS 请求完全不走它。必须补上 https-proxy:
composer config --global http-proxy "http://proxy.internal:8080" composer config --global https-proxy "http://proxy.internal:8080"
注意:
-
https-proxy的值仍是http://协议(不是https://),这是为了建立 CONNECT 隧道 - 漏掉
https-proxy会导致所有 HTTPS 仓库(包括 Nexus)请求超时或被拦截,且无明确错误提示 - 环境变量
HTTP_PROXY/HTTPS_PROXY不会被 Composer 自动读取,必须显式配置
最易忽略的是 Nexus 端的 HTTPS 配置是否真正生效(比如 application-port-ssl=8443 是否写入 nexus.properties,keystore.jks 是否放在 etc/ssl/ 下,Jetty 是否加载了 SSL connector)。光改 URL 为 https:// 而 Nexus 本身没跑在 HTTPS 上,只会让 Composer 报连接失败,而不是认证失败。











