Nexus私有Docker镜像拉取失败:x509证书验证错误求助
解决Docker拉取私有镜像时的x509证书验证失败问题
这个错误的核心原因很明确:你的自签名SSL证书没有包含IP地址的SAN(Subject Alternative Name)字段。虽然你已经把证书放到了Docker的certs.d目录,但Docker在验证证书时,会严格检查SAN是否匹配目标IP——哪怕证书的CN(通用名称)是这个IP也没用,这是当前TLS安全规范的硬性要求。
下面是一步步的解决方法:
1. 重新生成包含IP SAN的自签名证书
首先创建一个自定义的OpenSSL配置文件,用来指定SAN字段。比如新建openssl-san.cnf文件,内容如下:
[req] distinguished_name = req_distinguished_name x509_extensions = v3_req prompt = no [req_distinguished_name] CN = 101.102.103.104 [v3_req] keyUsage = keyEncipherment, dataEncipherment extendedKeyUsage = serverAuth subjectAltName = @alt_names [alt_names] IP.1 = 101.102.103.104
然后用这个配置生成新的证书和密钥:
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout nexus.key -out nexus.crt -config openssl-san.cnf
2. 更新Nginx和Nexus的证书
把新生成的nexus.key和nexus.crt替换掉你之前在Nginx配置中使用的证书文件,同时确保Nexus的Docker仓库配置也指向新的证书(如果Nexus本身直接使用证书的话)。之后重启Nginx和Nexus服务:
# 重启Nginx systemctl restart nginx # 重启Nexus(根据你的启动方式调整,比如用systemd管理的话) systemctl restart nexus
3. 更新Docker主机的证书并重启Docker
先删除Docker主机上旧的证书:
rm /etc/docker/certs.d/101.102.103.104:5051/nexus.crt
把新生成的nexus.crt复制到这个目录:
cp nexus.crt /etc/docker/certs.d/101.102.103.104:5051/
最后重启Docker服务,让配置生效:
systemctl restart docker
4. 验证证书是否正确配置
你可以用下面的命令检查新证书是否包含IP SAN:
openssl x509 -in nexus.crt -text -noout | grep -A 10 "Subject Alternative Name"
如果输出里能看到IP Address:101.102.103.104,说明证书已经正确包含了IP SAN字段。
现在再尝试执行docker pull 101.102.103.104:5051/docker-image-14:1,应该就能正常拉取镜像了。
内容的提问来源于stack exchange,提问作者user4948798




