Verify repository client with certificates

预计阅读时间:3分钟

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

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

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

Understand the configuration

通过在/etc/docker/certs.d下使用与注册表主机名相同的名称(例如localhost )创建一个目录来配置自定义证书. 所有*.crt文件都作为 CA 根目录添加到此目录.

Note

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

一个或多个<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               <-- Certificate authority that signed
                                    the registry certificate

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

Create the client certificates

使用 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 所需的证书类型不兼容.

Troubleshooting tips

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
Usage, registry, repository, client, root, certificate, docker, apache, ssl, tls, documentation, examples, articles, tutorials

by  icopy.site