使用憑證驗證儲存庫用戶端

使用 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 的 genrsareq 命令,首先產生 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