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
相关产品推荐
相关产品推荐

