使用證書驗證儲存庫客戶端
在使用 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 的 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