关键是要打通服务端TLS配置、客户端信任链和认证流程三环:服务端需用匹配域名/IP的完整证书链启用HTTPS并禁用HTTP回退;客户端须将根证书复制到/etc/docker/certs.d/域名:端口/ca.crt并重启docker服务;认证需确保反向代理透传Authorization头且登录命令带端口。

要在 Docker 中让镜像仓库支持 HTTPS 并确保客户端能正常 push/pull,关键不是只配证书,而是打通“服务端 TLS 配置 + 客户端信任链 + 认证流程”三环。跳过任一环都会报 x509: certificate signed by unknown authority 或 unauthorized。
服务端:用有效证书启用 HTTPS,禁用 HTTP 回退
自签名证书虽可启用 HTTPS,但 Docker 客户端默认拒绝信任;生产环境务必使用受信 CA(如 Let's Encrypt、企业内网 CA)签发的证书。
- 证书必须匹配访问地址:若用
registry.example.com:443访问,域名需出现在证书的 Subject Alternative Name(SAN)中;若直连 IP(如192.168.1.100:5000),IP 必须显式写入 SAN - 证书链要完整:服务端需提供服务器证书 + 所有中间证书(root 证书由客户端内置,无需部署)
- 私钥权限设为
600,证书建议放/etc/ssl/private/等安全路径 - 禁用 HTTP 端口:Registry 原生监听 5000 端口时,需在配置中注释或删除
http段,只保留https段并指定certificate和key - 若用 Nginx/Traefik 反代,TLS 在代理层终止,后端 registry 可走 HTTP(限内网),同时关闭外部对 5000 端口的直接访问
客户端:让 Docker daemon 显式信任证书(不是改系统 CA)
Docker daemon 不读取系统 CA 池,也不认容器内挂载的证书——它只认 /etc/docker/certs.d/:/ca.crt 这个固定路径下的根证书文件。
- 路径必须严格匹配:例如你执行
docker login registry.local:443,证书就得放在/etc/docker/certs.d/registry.local:443/ca.crt - 文件名必须是
ca.crt(不能是 cert.pem、domain.crt 等),格式为 PEM(以-----BEGIN CERTIFICATE-----开头) - 若证书链不完整(比如缺中间 CA),可把 root CA 和中间证书合并成一个
ca.crt,顺序为:根证书在前,中间证书在后 - 操作后必须重启 daemon:
sudo systemctl restart docker(不是重启容器) - macOS 用户注意:Docker Desktop 需通过设置 → Resources → TLS Certificates 导入,或导入系统钥匙串并设为“始终信任”
验证与排错要点
别只看 docker login 是否成功,要分层验证:
- 先用
curl -v https://registry.example.com:443/v2/测试:返回 200 或 401 表示 HTTPS 已通;若返回连接拒绝或 301 跳转到 HTTP,说明 HTTP 未真正关闭 - 再运行
docker login registry.example.com:443,输入账号密码,成功后检查~/.docker/config.json是否存入对应 registry 的凭据 - 执行
docker push registry.example.com:443/myapp:latest,失败时加--debug查看日志中是否仍有证书校验错误 - 常见坑:目录名漏端口、证书放错位置(如丢进
/usr/local/share/ca-certificates/却没运行update-ca-certificates)、Nginx 默认剥离Authorizationheader 导致认证失败
容器内部访问外部 HTTPS 服务的证书问题
如果你的应用容器需要调用外部 HTTPS API(比如 GitLab、Jenkins),但报 x509: certificate signed by unknown authority,那问题不在 Docker daemon,而在容器自身缺少根证书。
- Alpine 镜像默认不含
ca-certificates,构建时加:RUN apk --no-cache add ca-certificates && update-ca-certificates - Debian/Ubuntu 镜像通常自带,但若基础镜像精简过,也需补装:
RUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/* - 已运行的容器可临时进入安装,然后重启容器生效











