[CentOS] 執行 docker login 時,出現 certificate signed by unknown authority 的錯誤訊息?
今天想把做好的 Docker 映象檔 (image),
上傳到公司的 Docker 儲存庫 (repository) 裡面。
結果一執行 docker login
,
就出現 x509: certificate signed by unknown authority 的錯誤訊息:
這個訊息最近才看過,應該是因為那台 CentOS 機器上,
沒有安裝網站的 HTTPS 憑證的 Root CA…
要怎樣才能讓 Docker 認得那個 Root CA 呢?
1. 下載網站的 Root CA 憑證
我們可以使用 openssl 指令,
來列出某個 HTTPS 網站用到的憑證,以及其相關的簽發憑證鍊。
像下面是列出 www.google.com 的憑證鍊:
$ openssl s_client -connect www.google.com:443 -showcerts CONNECTED(00000005) depth=3 C = BE, O = GlobalSign nv-sa, OU = Root CA, CN = GlobalSign Root CA verify return:1 depth=2 C = US, O = Google Trust Services LLC, CN = GTS Root R1 verify return:1 depth=1 C = US, O = Google Trust Services LLC, CN = GTS CA 1C3 verify return:1 depth=0 CN = www.google.com verify return:1 --- Certificate chain 0 s:/CN=www.google.com i:/C=US/O=Google Trust Services LLC/CN=GTS CA 1C3 -----BEGIN CERTIFICATE----- MIIFUzCCBDugAwIBAgIRAPSm69k6X5hqCgAAAAEZVT8wDQYJKoZIhvcNAQELBQAw ...... fiM81DBT/hpfR8WtyxxF7a8rg5q77Qo= -----END CERTIFICATE----- 1 s:/C=US/O=Google Trust Services LLC/CN=GTS CA 1C3 i:/C=US/O=Google Trust Services LLC/CN=GTS Root R1 -----BEGIN CERTIFICATE----- MIIFljCCA36gAwIBAgINAgO8U1lrNMcY9QFQZjANBgkqhkiG9w0BAQsFADBHMQsw ...... 1IXNDw9bg1kWRxYtnCQ6yICmJhSFm/Y3m6xv+cXDBlHz4n/FsRC6UfTd -----END CERTIFICATE----- 2 s:/C=US/O=Google Trust Services LLC/CN=GTS Root R1 i:/C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA -----BEGIN CERTIFICATE----- MIIFYjCCBEqgAwIBAgIQd70NbNs2+RrqIQ/E8FjTDTANBgkqhkiG9w0BAQsFADBX ...... d0lIKO2d1xozclOzgjXPYovJJIultzkMu34qQb9Sz/yilrbCgj8= -----END CERTIFICATE----- --- ......
openssl 列出的憑證順序,是由網站的憑證,一路往上層的 CA,一直到 Root CA 為止。
因此簽發的順序是 GlobalSign Root CA -> GTS Root R1 -> GTS CA 1C3 -> www.google.com。
這個 GlobalSign Root CA,就是本次的最上層 Root CA。
把它對應的 -----BEGIN CERTIFICATE-----
到 -----END CERTIFICATE-----
間的內容,
儲存成一個文字檔,就是 Root CA 的憑證了:
-----BEGIN CERTIFICATE----- MIIFYjCCBEqgAwIBAgIQd70NbNs2+RrqIQ/E8FjTDTANBgkqhkiG9w0BAQsFADBX ...... d0lIKO2d1xozclOzgjXPYovJJIultzkMu34qQb9Sz/yilrbCgj8= -----END CERTIFICATE-----
上面是拿 www.google.com 舉例,
公司的儲存庫的 Root CA 事實上是另外一家喔。
2. 將 Root CA 憑證更新至 Linux 信任的 Root CA 庫
將剛剛的 Root CA 憑證,儲存到 /etc/pki/ca-trust/source/anchors 目錄下。
檔案名稱可以自己取,不過為了方便對照,
可以取成 <Root CA name>.pem 比較容易看。
接著,執行 sudo update-ca-trust
指令,
這會將 /etc/pki/ca-trust/source/anchors 下所有的憑證,
都加到 /etc/pki/tls/certs/ca-bundle.crt 裡面。
這樣子,我們新加入的 Root CA 應該就已經被這台 CentOS 所信任了。
3. 重啟 Docker 服務
將 Docker 服務重啟,確保它可以讀到新的 Root CA 集合:
systemctl restart docker
4. 重新登入遠端 Docker 儲存庫
重新執行一次 docker login
指令,這時已經可以成功連上遠端儲存庫了,
表示這個儲存庫用到的 Root CA 確實已經被系統信任:
之後再遇到類似憑證不被信任的問題,
也可以用同樣的方法來解決囉~
參考資料:ssl – “docker pull” certificate signed by unknown authority