docker 登录失败 -> x509:由未知授权机构签署的证书.. "crypto/rsa: verification error"

docker login fails -> x509: certificate signed by unknown authority .. "crypto/rsa: verification error"

我已经创建了一个私有的 docker 注册表,它以 NGINX 为前端。 NGINX 是 ssl 终止的地方。

为了这个问题,我使用 my-domain.com 混淆了我的域。

我正在使用安装了 boot2docker 的 OSX 10.10.3。但应该注意 Vag运行t + CoreOS + Docker 的工作流程不应该涉及 boot2docker 因为我在 VM(CoreOS) 而不是主机 (OSX).

我正在使用 Vag运行t 从这个 box 启动本地 CoreOS 虚拟机。然后我通过 ssh 进入该 VM 的一个实例并尝试发出以下命令

$ docker login docker.my-domain.com

然后系统会按预期提示我输入用户名、密码和电子邮件;我会提供我的详细信息。

注意:我能够按预期在主机 OS (OSX) 中发出上述命令并能够成功登录(生成 ~/.dockercfg文件)。

我收到以下错误:

FATA[0008] Error response from daemon: v1 ping attempt failed with error: Get https://docker.my-domain.com/v1/_ping: 
x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to 
verify candidate authority certificate "*.my-domain.com"). If this private registry supports only HTTP or HTTPS 
with an unknown CA certificate, please add `--insecure-registry docker.my-domain.com` to the daemon's 
arguments. In the case of HTTPS, if you have access to the registry's CA certificate, no need for the flag; 
simply place the CA certificate at /etc/docker/certs.d/docker.my-domain.com/ca.crt

我已经从我的自签名中复制了我的 ca.crt。我可以确认 CoreOS 能够通过 SSL 正确连接到我的服务器。我运行这个命令

openssl s_client -CAfile /etc/docker/certs.d/docker.my-domain.com/ca.crt -connect docker.my-domain.com:443

我得到了预期的 'Verify return code: 0 (ok)'。这让我相信它的 docker 似乎有问题。

$ docker version (from within CoreOS VM)
Client version: 1.6.1-rc2
Client API version: 1.18
Go version (client): go1.4.2
Git commit (client): 17f157d-dirty
OS/Arch (client): linux/amd64
Server version: 1.6.1-rc2
Server API version: 1.18
Go version (server): go1.4.2
Git commit (server): 17f157d-dirty
OS/Arch (server): linux/amd64

毕竟,我不确定下一步需要尝试什么。感谢您提供任何帮助!

原来这是一个分为两部分的问题。第一个问题是,当我将证书文件(ca.crt) 放在相对的/etc/ssl/certs/ 文件夹中时,我没有使用.pem 扩展名重命名原始文件。这意味着当我 运行 update-ca-certificates 在客户端机器上安装我的自定义证书时,它没有被识别。这隐藏了第二个也是主要的问题。

我没有使用正确的证书文件。一旦我使用了正确的证书文件,我将文件重命名为具有 .pem 扩展名 I 运行 update-ca-certificates 然后发出登录命令并且它有效。

我假设我必须在我的主机 OSX 机器上正确安装了正确版本的证书,这就是它在那里工作但在 VM 中不起作用的原因。

这对其他人 运行 非常有用。.如果您使用的是中间证书,docker 看到的 ca.pem 文件 必须 中同时包含根证书和中间证书。如果您使用的是客户端证书,您几乎肯定希望 ~/.docker/ca.pem 文件中也包含完整的证书链。