containerd拉取内网私有仓库镜像报x509错误,本质是TLS校验失败,需将PEM格式ca.crt严格按访问地址(含端口)置于/etc/containerd/certs.d/对应目录或系统信任锚点并重启containerd。

在使用 containerd 拉取内网私有镜像仓库(如 Harbor、registry:2 或自建 HTTPS 仓库)时,执行 crictl pull 或 Pod 启动失败并报 x509: certificate signed by unknown authority,说明 containerd 在 TLS 握手阶段无法验证服务器证书——它找不到可信任的根证书来完成链式校验,而非网络不通或镜像不存在。
确认证书存放路径与访问地址严格匹配
containerd 不会模糊匹配域名或端口。你用什么地址拉取,就必须在对应路径下放好 ca.crt。
比如执行:crictl pull 10.130.135.145:30500/busybox:test,则必须创建目录 /etc/containerd/certs.d/10.130.135.145:30500/;若用域名访问 harbor.internal:443,目录名就得是 /etc/containerd/certs.d/harbor.internal:443/,少一个字符、多一个斜杠、省略端口都不行。
目录下只允许存在一个文件:【ca.crt】(全小写,无 .pem/.crt.bak 等后缀),内容必须是以 -----BEGIN CERTIFICATE----- 开头的 PEM 格式根 CA 公钥。
方法一:通过 /etc/containerd/certs.d/ 目录配置(适用于 containerd v1.7+)
第一步:创建证书目录sudo mkdir -p /etc/containerd/certs.d/your-registry:port(将 your-registry:port 替换为实际地址,如 10.130.135.145:30500)
第二步:复制证书文件sudo cp /path/to/ca.crt /etc/containerd/certs.d/your-registry:port/ca.crt
第三步:检查权限
文件权限必须为 644,否则 containerd 会静默忽略:sudo chmod 644 /etc/containerd/certs.d/your-registry:port/ca.crt
第四步:重启生效sudo systemctl restart containerd
方法二:注入系统级信任(openEuler/CentOS/RHEL 推荐)
某些发行版(如 openEuler 24.03 LTS-SP1)默认不读取 /etc/containerd/certs.d/ 下的证书,而是依赖系统 CA 存储。此时需将 CA 证书导入系统信任锚点。
方法一:把 ca.crt 复制到系统信任目录sudo cp ca.crt /etc/pki/ca-trust/source/anchors/
方法二:刷新系统信任库sudo update-ca-trust extract
方法三:重启 containerd 服务使变更生效sudo systemctl restart containerd
注意:这一步不可跳过,仅刷新 CA 不会自动让 containerd 重载信任库。
验证证书是否被正确加载
执行命令:openssl s_client -connect your-registry:port -showcerts 2>/dev/null | openssl x509 -noout -text | grep -A1 "Subject Alternative Name\|Subject"
确认输出中的 DNS/IP 条目与你实际访问的地址完全一致。例如访问的是 10.130.135.145:30500,证书 SAN 中就必须包含该 IP,不能只有 harbor.internal。
如果返回空或显示 unable to get local issuer certificate,说明证书未被识别或链不完整——请检查是否漏掉了中间 CA,或是否误用了服务端证书而非根 CA 证书。

















