You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Registry配置mTLS后,docker login/pull强制HTTPS请求失败求助

问题描述

已按Docker文档部署端口5000的标准Registry,通过外部Nginx在443端口启用mTLS,Nginx校验客户端证书后将流量代理至Registry容器。使用curl测试正常:

curl -k --key ssl/client.key --cert ssl/client.crt https://localhost/v2/ 
{"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":null}]}

已将客户端证书放置在/etc/docker/certs.d/localhost目录,但docker login和pull始终发起HTTP请求而非HTTPS,即使指定协议也无效:

docker login --username a --password b https://localhost:443
Error response from daemon: login attempt to http://localhost:443/v2/ failed with status: 400 Bad Request

尝试将localhost:443加入不安全注册表(/etc/docker/daemon.json)也未解决问题。

解决方法

1. 修正证书目录结构

Docker根据「域名+端口」匹配证书信任目录,你之前创建的/etc/docker/certs.d/localhost目录不包含端口,无法被localhost:443的请求匹配。需要创建带端口的目录,并放入服务器证书的CA根证书:

mkdir -p /etc/docker/certs.d/localhost:443
# 将签署Nginx服务器证书的CA根证书放入该目录,命名为ca.crt
cp /path/to/your/ca.crt /etc/docker/certs.d/localhost:443/ca.crt

2. 移除不安全注册表配置

将localhost:443加入insecure-registries会强制Docker使用HTTP访问该地址,与你需要的HTTPS需求冲突。修改/etc/docker/daemon.json,删除该配置:

{}

修改完成后重启Docker daemon:

systemctl restart docker

3. 指定客户端证书完成mTLS认证

Docker客户端需要提供证书才能通过Nginx的mTLS校验,有两种方式:

  • 临时指定参数:在docker login时直接指定客户端证书和密钥:
    docker login --username a --password b --cert ssl/client.crt --key ssl/client.key https://localhost:443
    
  • 永久配置:将客户端证书和密钥复制到当前用户的Docker配置目录,后续命令会自动使用:
    cp ssl/client.crt ~/.docker/cert.pem
    cp ssl/client.key ~/.docker/key.pem
    # 之后直接执行login即可
    docker login --username a --password b https://localhost:443
    

4. 验证pull操作

完成login后,测试pull命令:

docker pull localhost:443/your-image:tag

内容的提问来源于stack exchange,提问作者Hvprvtr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 11:12:49