使用憑證驗證儲存庫用戶端
在以 HTTPS 執行 Docker 一文中,您已了解預設情況下 Docker 透過非網路的 Unix socket 執行,且必須啟用 TLS 才能讓 Docker 客戶端與守護行程 (daemon) 透過 HTTPS 安全通訊。TLS 可確保登錄端點的真實性,並對往返登錄檔的流量進行加密。
本文示範如何確保 Docker 登錄伺服器與 Docker 守護行程(作為登錄伺服器的客戶端)之間的流量已加密,並透過基於憑證的客戶端-伺服器驗證進行適當的身分驗證。
我們將展示如何為登錄檔安裝憑證授權單位 (CA) 根憑證,以及如何設定客戶端 TLS 憑證以進行驗證。
了解配置
自訂憑證是透過在 /etc/docker/certs.d 下建立與登錄伺服器主機名稱相同的目錄(例如 localhost)來配置的。所有 *.crt 檔案都會作為 CA 根憑證新增至此目錄中。
注意在 Linux 上,任何根憑證授權單位都會與系統預設值(包括主機的根 CA 集)合併。如果您是在 Windows Server 上執行 Docker,或是使用 Windows 容器的 Docker Desktop for Windows,則僅在未配置自訂根憑證時才會使用系統預設憑證。
出現一個或多個 <filename>.key/cert 配對,即表示 Docker 需要自訂憑證來存取目標儲存庫。
注意如果存在多個憑證,系統會按字母順序逐一嘗試。如果出現 4xx 或 5xx 等級的驗證錯誤,Docker 會繼續嘗試下一個憑證。
以下說明包含自訂憑證的配置
/etc/docker/certs.d/ <-- Certificate directory
└── localhost:5000 <-- Hostname:port
├── client.cert <-- Client certificate
├── client.key <-- Client key
└── ca.crt <-- Root CA that signed
the registry certificate, in PEM上述範例為作業系統專屬,僅供說明之用。您應查閱您的作業系統文件,了解如何建立作業系統提供的捆綁憑證鏈。
建立客戶端憑證
使用 OpenSSL 的 genrsa 和 req 指令,首先產生 RSA 金鑰,然後使用該金鑰建立憑證。
$ openssl genrsa -out client.key 4096
$ openssl req -new -x509 -text -key client.key -out client.cert
注意這些 TLS 指令僅能在 Linux 上產生可運作的憑證集。macOS 中的 OpenSSL 版本與 Docker 所需的憑證類型不相容。
疑難排解提示
Docker 守護行程將 .crt 檔案解釋為 CA 憑證,並將 .cert 檔案解釋為客戶端憑證。如果 CA 憑證被錯誤地賦予了 .cert 副檔名而不是正確的 .crt 副檔名,Docker 守護行程將記錄以下錯誤訊息
Missing key KEY_NAME for client certificate CERT_NAME. CA certificates should use the extension .crt.如果存取 Docker 登錄檔時未帶連接埠號,請勿將連接埠新增至目錄名稱中。以下顯示登錄檔在預設連接埠 443 上的配置,該配置可透過 docker login my-https.registry.example.com 進行存取
/etc/docker/certs.d/
└── my-https.registry.example.com <-- Hostname without port
├── client.cert
├── client.key
└── ca.crt