事情是这样的:
我搭建了一个docker的私有仓库,本来在docker客户端设置insecure-registries后(如下设置),用的是好好的。
# 在/etc/docker/daemon.json里添加insecure-registries、registry-mirror # cat /etc/docker/daemon.json { "insecure-registries": ["nexus3-docker-cicd.apps.test.openshift.com:80", "nexus3-docker-hosted-cicd.apps.test.openshift.com:80"], "registry-mirror": ["nexus3-docker-cicd.apps.test.openshift.com:80"] } # systemctl daemon-reload # systemctl restart docker
然后,我给这个仓库的访问加上了https,既然是https了,那就不应该是insecure-registries了,所以我去掉了insecure-registries的设置(如下设置),嘿嘿嘿……
# cat /etc/docker/daemon.json { "registry-mirrors": ["https://nexus3-docker-cicd.apps.test.openshift.com"] } # systemctl daemon-reload # systemctl restart docker
再然后,就报错了。
docker pull x509:certificate signed by unknown authority
解决方法:
我们浏览器访问一个https的网站时,由浏览器去检测https的证书的可信性。浏览器内置一些信任的CA机构,由这些CA机构颁发的证书,浏览器则认为是安全的,当我们的自签名证书提示证书不安全时,可以手动把这个证书添加到浏览器的信任列表里。
同理,当我们在用docker pull等命令时,docker调用的是系统的CA,这些证书保存在/etc/pki/certs/ca-bundle.crt中(centos系统),所以我们把网站的https证书加入到这个文件,重启服务即可。
# 把网站的https证书内容加载到系统ca-bundle中
# echo -n | openssl s_client -showcerts -connect nexus3-docker-cicd.apps.test.openshift.com:443 2>/dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' >> /etc/pki/tls/certs/ca-bundle.crt
# systemctl daemon-reload
# systemctl restart docker
突然发现,openssl命令好强大!