docker客户端信任私有仓库自签名ssl证书的关键是将证书严格按地址+端口匹配放入/etc/docker/certs.d/{host}:{port}/ca.crt路径,并重启docker服务;证书名必须为ca.crt,不可放系统ca存储,也不需update-ca-certificates。

要让 Docker 客户端信任私有仓库的自签名 SSL 证书,关键不是“全局安装证书”,而是把证书放到 Docker 守护进程(daemon)指定的信任路径下,并确保该路径与仓库地址严格匹配(含端口)。操作分三步:生成证书、部署证书、重启服务。
确认私有仓库地址和端口
Docker 对证书路径的命名非常敏感。例如,若仓库地址是 https://registry.example.com:5000,那么证书必须放在:
- /etc/docker/certs.d/registry.example.com:5000/ca.crt(Linux)
- 路径中域名和端口必须完全一致,不能省略端口,也不能用 IP 替代域名(除非你用 IP 访问且证书 SAN 中包含该 IP)
把自签名证书放入 Docker 信任目录
假设你已用 openssl 生成了 domain.crt(即公钥证书),执行以下命令:
- 创建目标目录:
sudo mkdir -p /etc/docker/certs.d/registry.example.com:5000 - 复制证书为 ca.crt:
sudo cp domain.crt /etc/docker/certs.d/registry.example.com:5000/ca.crt - 确保权限正确:
sudo chmod 644 /etc/docker/certs.d/registry.example.com:5000/ca.crt
注意:不要把证书加到系统级 CA 存储(如 /usr/local/share/ca-certificates/),Docker daemon 默认不读取那里;也不需要运行 update-ca-certificates。
重启 Docker 并验证是否生效
证书放好后,必须重启 Docker daemon 才能加载新配置:
-
sudo systemctl restart docker(systemd 系统) - 然后测试拉取:
docker pull registry.example.com:5000/hello-world - 成功则说明信任已建立;失败时可检查:
sudo journalctl -u docker.service -n 50 --no-pager查看具体报错
常见踩坑点
很多问题其实卡在细节上:
- 证书文件名必须是 ca.crt,不能是
domain.crt或cert.pem - 目录名必须和
docker login或docker pull时用的地址完全一致(大小写、端口、有无协议前缀都不影响路径,但域名+端口必须一字不差) - 如果用
localhost或127.0.0.1测试,证书的 Subject Alternative Name(SAN)必须包含对应条目,否则即使路径对也会报 x509 错误 - Mac 或 Windows 上使用 Docker Desktop 时,证书需放入 Docker Desktop 内置 Linux VM 的对应路径,或通过 GUI 设置 → Resources → Certificates 导入











