关键是要将根证书ca.crt置于/etc/docker/certs.d/对应地址+端口目录,确保路径、文件名、权限严格匹配,并重启docker服务。
要让 Docker 客户端信任私有仓库的 TLS 证书,关键不是改系统 CA 存储,而是把根证书(ca.crt)放到 Docker 守护进程专属的信任目录里,并确保路径、文件名、权限和重启动作全部正确。
Docker 守护进程严格按“访问地址+端口”匹配证书目录。你 pull 时用什么地址,目录名就必须完全一致:
docker pull registry.example.com:443/myapp,目录应为:/etc/docker/certs.d/registry.example.com:443/
docker pull 192.168.1.100:5000/app,目录必须是:/etc/docker/certs.d/192.168.1.100:5000/(不能省略 :5000,也不能写成 192.168.1.100)
目录下只认一个固定名字的文件:ca.crt(全小写,无 .pem 后缀),内容必须是 PEM 格式:
-----BEGIN CERTIFICATE----- 开头,-----END CERTIFICATE----- 结尾644:运行 sudo chmod 644 /etc/docker/certs.d/your-registry:port/ca.crt
Docker 不会热加载证书,修改后不重启等于没配:
sudo systemctl restart docker
docker pull your-registry:port/some-image,不再报 x509: certificate signed by unknown authority 即成功openssl s_client -connect your-registry:port -showcerts 检查服务端实际返回的证书是否匹配你放的 ca.crtHTTPS 仓库和 HTTP 仓库的配置逻辑完全不同,混用会导致看似登录成功、实则拉取失败:
docker login 必须加 https:// 前缀:docker login https://registry.example.com
registry:2 默认监听 5000),docker login 不能加协议,且需在 /etc/docker/daemon.json 中显式声明:"insecure-registries": ["your-registry:port"],再重启 dockerd