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

预计阅读时间:2分钟

使用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容器的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

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

创建客户端证书

使用OpenSSLgenrsareq命令首先生成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
用法注册表存储库客户端根目录证书dockerapachessltls文档示例文章教程