使用证书进行存储库客户端验证 | 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的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. 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守护进程套接字