Docker pull 时出现 TLS 证书验证失败错误
本文适用于:
- • Docker 20+ / 24+
- • 国内网络环境
- • 老旧 Linux 系统(CentOS 7 / Ubuntu 18.04)或最小化系统
- • 企业网络环境(可能有 MITM 拦截)
- • 遇到 TLS 证书验证失败错误
⚠️ 重要提示
这不是镜像仓库的问题,而是客户端系统缺少根证书或证书过期。
原因诊断树:
TLS 证书验证失败 ├─ 系统缺少根证书(最常见) ├─ Docker 未使用最新证书 ├─ 企业网络 MITM 拦截 └─ Docker 版本过旧
✅ 推荐做法
优先更新系统 ca-certificates 包并重启 Docker。企业环境需要导入公司内部 CA 证书。
当您在拉取镜像时遇到 TLS 证书验证失败错误,Docker 无法验证镜像仓库的 SSL/TLS 证书,导致 docker pull 无法正常工作。
错误示例
错误含义
核心报错信息:
这表示 Docker 客户端无法验证镜像仓库的 TLS/SSL 证书,因为证书是由客户端系统不认识的证书颁发机构(CA)签发的。
简而言之:客户端系统缺少根证书或证书链不完整 → 无法验证服务器证书 → TLS 握手失败 → docker pull 被阻止
常见原因
原因 1:客户端系统缺少根证书更新
这是最常见的原因,多见于以下系统环境:
- • 老旧 Linux 系统(例如 CentOS 7 / Ubuntu 18.04)
- • 最小化系统(如 Alpine / Debian-slim),默认不包含 CA 证书包
- • 安装 Docker 时没有安装系统 CA 证书包
验证方法:检查系统证书数量
如果输出数量很少(几十个以内),说明系统缺少根证书包。
原因 2:Docker 守护进程未使用最新证书
Docker 守护进程(dockerd)不会自动使用系统证书更新,某些旧版本需要手动重载证书。
即使系统证书已更新,Docker 可能仍在使用旧的证书缓存。
原因 3:网络环境对 TLS 流量进行拦截(MITM)
某些公司网络、代理网关或 VPN 会对 HTTPS 流量进行中间人拦截(MITM),将证书链替换为公司内部 CA 签发的证书。
检查方法:查看实际证书颁发者
如果显示的 issuer 不是 Let's Encrypt、Google Trust、GlobalSign 等正规机构,而是公司域名或其他 CA,就是这个问题。
原因 4:Docker 版本过旧
旧版 Docker(低于 20.10)存在 TLS 兼容性问题,特别是对 ECC 证书支持不完全。
检查方法:
如果 Server Version 低于 20.10,建议升级 Docker。
解决方案
✅ 方案 1:更新系统根证书(推荐)
根据您的系统类型,执行相应的命令安装或更新 CA 证书包:
Debian / Ubuntu 系统:
CentOS / RHEL 系统:
Alpine 系统:
✅ 方案 2:更新证书后重启 Docker 服务
安装或更新证书后,需要让 Docker 重新加载证书:
重启后再次尝试拉取镜像。
✅ 方案 3:导入公司内部 CA 证书(适用于企业网络环境)
如果您处于使用了中间人拦截的企业网络环境,需要导入公司的根 CA 证书:
注意:请联系公司 IT 部门获取正确的根 CA 证书文件。
✅ 方案 4:升级 Docker 到最新版本
如果您的 Docker 版本低于 20.10,建议升级到最新版本以获得更好的 TLS 支持:
可以使用轩辕镜像提供的一键安装脚本(支持 Docker 和 Docker Compose 一键安装并配置镜像源):
⚠️ 临时方案:跳过 TLS 验证
编辑 /etc/docker/daemon.json,添加不安全的镜像仓库配置:
或者针对通用域名:
保存后重载配置并重启 Docker:
💡 总结:
- ✅ TLS 证书验证失败通常是因为客户端系统缺少根证书或证书过期
- ✅ 优先方案:安装/更新
ca-certificates包并重启 Docker - ✅ 企业网络环境需要导入公司内部 CA 证书
- ✅ 建议将 Docker 升级到 20.10 或更高版本
- ⚠️ 临时跳过 TLS 验证的方案用于测试
本文由「xuanyuan.cloud」维护
专注国内 Docker / 镜像 / Registry 网络问题
内容基于真实用户环境与实测