关键是要打通服务端tls配置、客户端信任链和禁用http回退三环:证书须含匹配域名或ip的san字段;registry需仅启用https并关闭http监听;客户端须将ca根证书置于/etc/docker/certs.d/域名:端口/ca.crt并重启docker服务。

要让私有镜像仓库支持 HTTPS,不能只放证书文件,关键得同时满足三件事:服务端正确启用 HTTPS 并关闭 HTTP 回退、客户端明确信任该仓库的根证书、通信全程不降级到 HTTP。漏掉任何一环,docker push 或 docker pull 都会失败。
证书必须匹配访问方式,且含 SAN 字段
现代 TLS 校验不再只看 CN(通用名称),必须检查 Subject Alternative Name(SAN)字段是否包含你实际使用的地址。
- 用
registry.example.com:443访问?证书 SAN 必须包含DNS.1 = registry.example.com - 用
192.168.1.100:443直连?SAN 必须包含IP.1 = 192.168.1.100 - 推荐用 OpenSSL 配置文件(如
san.cnf)生成证书,避免后期报x509: certificate signed by unknown authority - 私钥权限设为
600,证书建议放在容器内安全路径(如/certs/),挂载时注意 SELinux 或 rootless 模式限制
Registry 服务端必须禁用 HTTP,只走 HTTPS
即使证书已配置,若 Registry 仍监听并响应 HTTP 请求,就存在中间人攻击风险。必须彻底关闭非加密通道。
- 裸 Registry:修改
config.yml,删掉或注释整个http:段,只保留https:段,并指定certificate和key路径 - 用 Nginx/Traefik 反代:TLS 在代理层终止,后端 Registry 可走 HTTP(仅限内网),同时禁止外部直接访问原生端口(如 5000)
- 验证方法:
curl -I http://registry.example.com应拒绝连接或返回 301;curl -I https://registry.example.com/v2/应返回 200 或 401
客户端必须显式信任根证书,不是改系统 CA
Docker daemon 不读系统证书池,只认固定路径下的 PEM 格式根证书文件。
- Linux 主机:把 CA 根证书复制为
/etc/docker/certs.d/registry.example.com:443/ca.crt,文件名必须是ca.crt - 用 IP 访问(如
192.168.1.100:443),路径必须是/etc/docker/certs.d/192.168.1.100:443/ca.crt - 证书链不完整时,把 root CA 和中间证书合并成一个
ca.crt,顺序为 root 在前、中间在后 - 操作后必须重启 Docker:
sudo systemctl restart docker
Harbor 用户额外注意证书导入与 UI 设置
Harbor 默认带自签名证书,生产环境建议替换为受信 CA 签发的证书,并完成平台级信任配置。
- 通过 Harbor Web UI 进入「设置 → 安全设置」,上传服务器证书和根证书(.pem 或 .crt 格式)
- 勾选「启用 HTTPS 访问」,保存后 Harbor 会自动重载 Nginx 配置
- 若使用自签名证书,仍需将根证书同步部署到所有 Docker 客户端的
/etc/docker/certs.d/对应路径 - 浏览器首次访问时可能提示不安全,需手动确认并信任,但这不影响 Docker CLI 的 push/pull 行为











