使用证书验证存储库客户端

使用 HTTPS 运行 Docker 中,您了解到,默认情况下, Docker 通过非联网的 Unix 套接字运行,并且必须按顺序启用 TLS 让 Docker 客户端和守护程序通过 HTTPS 安全通信。TLS 可确保 Registry 终端节点的真实性,并且进出 Registry 的流量是加密的。

本文演示了如何确保 Docker 注册表之间的流量 server 和 Docker 守护程序(注册表服务器的客户端)被加密,并且 使用基于证书的客户端-服务器身份验证进行正确身份验证。

我们将向您展示如何安装证书颁发机构 (CA) 根证书 了解注册表以及如何设置客户端 TLS 证书以进行验证。

了解配置

自定义证书的配置方法是使用与注册表主机名相同的名称(如 .所有文件都将作为 CA 根添加到此目录中。/etc/docker/certs.dlocalhost*.crt

注意

在 Linux 上,任何根证书颁发机构都与系统默认值合并, 包括主机的根 CA 集。如果您在 Windows Server 上运行 Docker, 或具有 Windows 容器的适用于 Windows 的 Docker Desktop,系统默认 仅当未配置自定义根证书时,才使用证书。

存在一个或多个对向 Docker 指示 访问所需的自定义证书 存储 库。<filename>.key/cert

注意

如果存在多个证书,则按字母顺序尝试每个证书 次序。如果存在 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

前面的示例特定于操作系统,用于说明 仅用于目的。您应该查阅操作系统文档 创建 OS 提供的捆绑证书链。

创建客户端证书

使用 OpenSSL 的 and 命令首先生成 RSA 密钥,然后使用该密钥创建证书。genrsareq

$ openssl genrsa -out client.key 4096
$ openssl req -new -x509 -text -key client.key -out client.cert

注意

这些 TLS 命令仅在 Linux 上生成一组工作证书。 macOS 中的 OpenSSL 版本与 Docker 所需的证书。

故障排除提示

Docker 守护程序将文件解释为 CA 证书和文件 作为客户端证书。如果意外地为 CA 证书提供了扩展名而不是正确的扩展名,则 Docker 守护程序会记录 以下错误消息:.crt.cert.cert.crt

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