使用證書驗證儲存庫客戶端

使用 HTTPS 執行 Docker 中,您瞭解到,預設情況下,Docker 透過一個非聯網的 Unix 套接字執行,必須啟用 TLS 才能讓 Docker 客戶端和守護程序透過 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 的 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