核心是让容器运行时信任内网仓库CA证书而非跳过验证;需将PEM格式ca.crt置于/etc/docker/certs.d/域名:端口/目录(Docker)或/etc/pki/ca-trust/source/anchors/(containerd),并确保域名、端口、协议与证书SAN及配置严格匹配。

核心是让容器运行时(Docker 或 containerd)明确信任你内网自建仓库的 CA 证书,而不是跳过验证。错误提示 x509: certificate signed by unknown authority 表明 TLS 握手时证书链无法追溯到它认可的根证书,和网络通不通、镜像存不存在无关。
确认访问地址与证书目录严格匹配
容器运行时按“完整访问地址(含端口)”查找证书,差一个字符都不行:
- 如果你执行 docker pull registry.internal:443/app,证书必须放在 /etc/docker/certs.d/registry.internal:443/
- 如果用 IP 访问,比如 10.10.20.5:30500,目录名就得是 /etc/docker/certs.d/10.10.20.5:30500/,不能省略端口,也不能写成 /etc/docker/certs.d/10.10.20.5/
- 目录下文件名必须是 ca.crt(全小写,无其他扩展名),内容为 PEM 格式(以 -----BEGIN CERTIFICATE----- 开头)
正确安装证书到运行时信任路径
不要改系统级 CA 存储(如 /usr/local/share/ca-certificates/),Docker 和 containerd 默认不读那里:
- 对 Docker:创建目录 sudo mkdir -p /etc/docker/certs.d/your-registry:port,复制证书 sudo cp ca.crt /etc/docker/certs.d/your-registry:port/ca.crt,权限设为 644,再 sudo systemctl restart docker
- 对 containerd(openEuler 等系统推荐方式):把 ca.crt 复制到 /etc/pki/ca-trust/source/anchors/,运行 sudo update-ca-trust extract,然后 sudo systemctl restart containerd
区分协议与登录方式,避免混用
HTTPS 仓库和 HTTP 仓库配置逻辑完全不同,混用会引发看似矛盾的错误:
- 若仓库启用了 HTTPS(如 Harbor 默认),docker login 必须带 https:// 前缀:docker login https://registry.internal
- 若仓库是纯 HTTP 模式(如本地 registry:2 监听 :5000),docker login 不加协议:docker login localhost:5000,同时必须在 /etc/docker/daemon.json 中配置 "insecure-registries": ["localhost:5000"] 并重启 dockerd
- 否则容易出现“登录成功但拉取失败”,或报 server gave HTTP response to HTTPS client
验证证书本身是否合规
即使放对了位置,证书自身问题也会导致失败:
- 用 openssl s_client -connect your-registry:port -showcerts 查看实际返回的证书,确认其 Subject 或 SAN 域名与你访问的地址完全一致(比如访问 IP 就不能只签了域名)
- 检查证书有效期:openssl x509 -in ca.crt -noout -dates,确保当前时间在 notBefore 和 notAfter 之间
- 确认你放的是根 CA 证书(不是服务端证书),且能完整构建信任链


















