2016-11-18 160 views
1

我对TLS认证的知识非常有限。我想为Docker守护进程启用https。我跟着this教程,但最终未能启动docker守护进程。Docker中的TLS失败

我在Ubuntu 16.04 VM中使用docker,我的客户端和服务器是同一台机器。所以在整个过程中我使用$hostname作为'Common Name'。

以下的全过程泊坞窗文档中,当我运行

sudo dockerd --tlsverify --tlscacert=ca.pem --tlscert=server-cert.pem --tlskey=server-key.pem -H=0.0.0.0:2376 

后,我得到的信息日志“API listen on [::]:2376

当我使用下面的命令:

docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H=$HOST:2376 version 

我得到适当的回应。

但是,当我重新加载守护进程,并尝试启动搬运工它说未能启动泊坞窗,并给出“journalctl -xe”下面的MESSAGE-

Job for docker.service failed because the control process exited with error code. 
See "systemctl status docker.service" and "journalctl -xe" for details. 

输出是:
enter image description here

我将必要的证书复制到~/.docker/,我的/lib/systemd/system/docker.service文件中的'ExecStart'是:

ExecStart=/usr/bin/dockerd -H fd:// -H 0.0.0.0:2376 \ 
    --tlsverify --tlscacert=/home/sakib/.docker/ca.pem \ 
    --tlskey=/home/sakib/.docker/key.pem \ 
    --tlscert=/home/sakib/.docker/cert.pem 

当我尝试使用API​​,我得到如下回应通信:

$ curl -X GET https://0.0.0.0:2376/images/json 

curl: (35) gnutls_handshake() failed: Certificate is bad 

$ docker version 

Client: 
Version:  1.12.1 
API version: 1.24 
Go version: go1.6.3 
Git commit: 23cf638 
Built:  Thu Aug 18 05:33:38 2016 
OS/Arch:  linux/amd64 
An error occurred trying to connect: Get https://EL802:2376/v1.24/version: x509: certificate is valid for $HOST, not EL802 

注:EL802是我的主机名,我设置为“HOST”环境变量。

我认为问题出在创建客户端证书时选择的'CN'名称。我创建了服务器和客户端证书作为如下─

服务器:

openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr    

客户:

openssl req -subj '/CN=$HOST' -new -key key.pem -out client.csr 

由于我的客户端和服务器是我的主机(EL802),我设置为$HOST变量。

回答

1

您的图片不显示完整的错误路线,但如果错误信息是:

pid file found, ensure docker is not running or delete /var/run/docker.pid 

尝试并删除PID,并重新启动。
同时仔细检查您的docker installation on Ubuntu及其systemd configuration

X509:证书有效期为$ HOST,不EL802

这意味着一直以字符串$ HOST,而不是其实际值创建的证书。

openssl req -subj '/CN=$HOST' 

强劲的报价单引号将防止外壳,它的值来代替$HOST。使用双引号。

+0

感谢您的PID问题。拍照时这是一个错误。我编辑了这个问题。我的主要问题实际上是我在为服务器/客户端创建CSR时选择的CN名称。但是当我使用一个不属于任何域的简单虚拟机(ex-XXcom)时,我不知道服务器/客户端的FQDN名称(例如CN名称)应该是什么。 –

+0

@zamansakib我已经编辑了我的答案。 – VonC

+0

感谢您的解决方案,但它提供了一个新的错误。不知道我应该为此创建一个新问题。现在,如果我尝试与API连接,则会收到以下非常奇怪的警告。 $卷曲的https:// $ HOST:2376 /图像/ JSON \ > --cert〜/ .docker/cert.pem \ > --key〜/ .docker/key.pem \ > --cacert〜/ .docker/ca.pem curl:(51)SSL:证书主体名称(EL802)与目标主机名'EL802'不匹配 –