在线文档教程

使用证书进行存储库客户端验证 | Using certificates for repository client verification (Engine)

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

在用HTTPS运行码头您了解到,默认情况下,Docker通过非联网的Unix套接字运行,为了让Docker客户端和守护进程在HTTPS上安全地通信,必须启用TLS。TLS确保注册表端点的真实性,并加密到/来自注册表的通信量。

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

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

理解配置

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

注意:从Docker 1.13开始,在Linux上,任何根证书颁发机构都将与系统默认值(即主机的根CA集合)合并。在1.13和Windows之前,只有在没有提供自定义根证书时才会使用系统默认证书。

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

注意:如果有多个证书,将按字母顺序尝试每个证书。如果存在认证错误(例如403,404,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

前面的示例是特定于操作系统的,仅用于说明性目的。在创建操作系统提供的捆绑证书链时,您应该参考操作系统文档。

创建客户端证书

您将使用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要求的证书类型不兼容。

故障排除提示

Docker守护进程解释.crt文件作为CA证书和.cert文件作为客户端证书。如果CA证书意外地被授予扩展名.cert而不是正确的.crt扩展时,Docker守护进程记录以下错误消息:

Missing key KEY_NAME for client certificate CERT_NAME. Note that 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

相关信息

  • 使用可信映像

  • 保护Docker守护进程套接字

用法注册表存储库客户端证书dockerapachessltls文档示例文章教程