使用Let's Encrypt证书设置Docker注册表

5
我将根据以下链接描述的步骤,设置一个域名注册处:

https://docs.docker.com/registry/deploying/

我为docker.mydomain.com生成了一个证书,并使用他们在我的服务器上提供的命令启动了docker:

docker run -d -p 5000:5000 --restart=always --name registry \
  -v `pwd`/certs:/certs \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  registry:2

我已启动 Docker,并指向通过 LetsEncrypt(https://letsencrypt.org/)获取的证书。
现在,当我浏览 https://docker.mydomain.com:5000/v2/ 时,我会得到一个只有 '{}' 的页面,同时有一个绿色锁头表示请求安全成功。
但是,当我尝试从另一台服务器执行 docker login docker.mydomain.com:5000 时,我会看到注册表 Docker 中出现错误。
 TLS handshake error from xxx.xxx.xxx.xxx:51773: remote error: bad certificate

我尝试了一些不同的证书设置,但出现了错误,例如:
remote error: unknown certificate authority

并且

 tls: first record does not look like a TLS handshake

我漏掉了什么?
1个回答

5

Docker似乎不支持SNI: https://github.com/docker/docker/issues/9969

更新:Docker现在应该支持SNI。

这意味着,在TLS事务期间连接到您的服务器时,Docker客户端不指定域名,因此您的服务器显示默认证书。

解决方案可能是将您的服务器的默认证书更改为适用于Docker域的有效证书。

此站点仅在支持SNI的浏览器中运行。

要检查您的(子)域是否与不支持SNI的客户端一起工作,可以使用ssllabs.com / ssltest:如果您看不到消息“此站点仅在支持SNI的浏览器中运行。”则它可以正常工作。


现在已经解决了,但根据您提供的链接和评论,子域名也应该可以工作吧?无论如何,感谢您的回答,我现在可以继续了。 - Oli
SNI的工作方式如下:SNI感知客户端未加密地发送域名。SNI感知服务器使用该信息来决定显示哪个证书。如果客户端不支持SNI,则服务器无法确定要显示哪个证书。在大多数情况下,服务器将显示声明的第一个证书,因此不支持SNI的客户端仅适用于列在该证书中的域。如果该证书还包含子域或通配符,则它也可以正常工作。 - Tom
要检查您的(子)域名是否与不支持SNI的客户端配合使用,可以使用https://www.ssllabs.com/ssltest :如果您看不到消息“此站点仅在具有SNI支持的浏览器中工作。”,那么它将正常工作。 - Tom
2
现在Docker支持SNI了。 - Justin Cormack
@JustinCormack 是从哪个版本开始的? - Julio Guerra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接