使用证书验证仓库客户端
在 使用 HTTPS 运行 Docker 中,您了解到,默认情况下,Docker 通过非网络化的 Unix 套接字运行,并且必须启用 TLS 才能使 Docker 客户端和守护程序通过 HTTPS 安全地通信。TLS 可确保注册表端点的真实性,并确保到/来自注册表的流量已加密。
本文演示了如何确保 Docker 注册表服务器和 Docker 守护程序(注册表服务器的客户端)之间的流量使用基于证书的客户端服务器身份验证进行加密和正确身份验证。
我们将向您展示如何为注册表安装证书颁发机构 (CA) 根证书,以及如何设置客户端 TLS 证书以进行验证。
了解配置
自定义证书是通过使用与注册表主机名相同的名称(例如 `localhost`)在 ` /etc/docker/certs.d` 下创建一个目录来配置的。所有 `*.crt` 文件都作为 CA 根添加到此目录中。
注意
在 Linux 上,任何根证书颁发机构都与系统默认值合并,包括主机设置的根 CA。如果您在 Windows Server 上运行 Docker,或在 Windows 容器中使用 Docker Desktop for Windows,则只有在未配置自定义根证书时才使用系统默认证书。
一个或多个 `
注意
如果存在多个证书,则按字母顺序尝试每个证书。如果出现 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