事情是這樣的:
我搭建了一個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命令好強大!