花了兩個小時才排除的問題,不記上一筆說不過去。

上回有介紹過如何在架設私有 Docker Registry 儲放 Docker Image,伺服器用 Docker 跑就可以,但要設定登入帳號密碼一定要走 HTTPS,故需要用 mkcert 建立 TLS 憑證、htpasswd 建立帳號跟密碼。上回在 Azure 開 Linux VM 測試過一切順利,今天在家裡的CentOS 迷你伺服器正式裝了一台,以簡化家用 3C 設備監控程式換版更新程序。(所謂一室之不治,何以天下國家為?CI/CD 先從家裡做起,噗)

沒想到,裝好 Docker Registry 要從 Windows docker login 時踢到鐵板,出現:Error response from daemon: Get "https://centos:8086/v2/": tls: failed to verify certificate: x509: certificate signed by unknown authority 錯誤訊息。

一開始爬文時觀念不夠清楚,我被導向修改 C:\Program Files\Docker\Docker\resources\windows-daemon-options.json 中的 insecure-registries:

反覆修改、重啟 Docker 服務、升級 Docker Desktop 版本,怎麼試結果都沒變。後來才猛然想起:insecure-registries 是允許在沒有 HTTPS 時改用 HTTP 連線,跟無法信任 TLS 憑證是兩碼事,我是在鬼打牆瞎忙什麼?

回頭驗證,確認在 CentOS 上可以 docker login,在 Windows 不行,故根本問題在於 Windows 不信任 mkcrt 簽發的憑證:

用之前學過的 openssl -showcerts 技巧,查詢 Docker Registry 傳回的憑證只有網站憑證,未包含 CA 根憑證,必須要到 CentOS 找:

爬文學到先用 mkcert -CAROOT 找到 CA 憑證儲存路徑,取得根憑證檔案 rootCA.pem:

將 rootCA.pem 帶回 Windows 更名為 rootCA.crt,安裝成受信任的根憑證:

安裝憑證後記得要重啟 Docker Desktop,重試 docker login,終於登入成功,喜極而泣。


Comments

# by 我是人类

非常好博客,使我docker旋转,爱来自上海

Post a comment