使用憑證驗證儲存庫用戶端
在 使用 HTTPS 執行 Docker 中,您瞭解到,預設情況下,Docker 會透過非網路 Unix Socket 執行,並且必須啟用 TLS 才能讓 Docker 用戶端和守護行程透過 HTTPS 安全地進行通訊。TLS 可確保儲存庫端點的真實性,以及往返儲存庫的流量已加密。
本文示範如何使用基於憑證的用戶端-伺服器驗證來確保 Docker 儲存庫伺服器和 Docker 守護行程(儲存庫伺服器的用戶端)之間的流量已加密並經過適當驗證。
我們將向您展示如何安裝儲存庫的憑證授權單位 (CA) 根憑證,以及如何設定用戶端 TLS 憑證以進行驗證。
瞭解設定
自訂憑證的設定方式是在 /etc/docker/certs.d
下建立一個目錄,並使用與儲存庫主機名稱相同的名稱,例如 localhost
。所有 *.crt
檔案都會新增至這個目錄作為 CA 根憑證。
**注意**
在 Linux 上,任何根憑證授權單位都會與系統預設值合併,包括主機的根 CA 集合。如果您在 Windows Server 上執行 Docker,或是在 Windows 容器中使用 Windows 版 Docker Desktop,則只有在未設定自訂根憑證時才會使用系統預設憑證。
一個或多個 <檔名>.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