Ssl TLS在Docker中失败

Ssl TLS在Docker中失败,ssl,docker,https,Ssl,Docker,Https,我对TLS认证的了解非常有限。我想为docker守护进程启用https。我遵循了教程,但最后未能启动docker守护进程 我在Ubuntu 16.04虚拟机中使用docker,我的客户机和服务器是同一台机器。因此,在整个过程中,我使用$hostname作为“通用名” 在完成docker文档中的整个过程后,当我运行 sudo dockerd --tlsverify --tlscacert=ca.pem --tlscert=server-cert.pem --tlskey=server-key.pe

我对TLS认证的了解非常有限。我想为docker守护进程启用https。我遵循了教程,但最后未能启动docker守护进程

我在Ubuntu 16.04虚拟机中使用docker,我的客户机和服务器是同一台机器。因此,在整个过程中,我使用
$hostname
作为“
通用名

在完成docker文档中的整个过程后,当我运行

sudo dockerd --tlsverify --tlscacert=ca.pem --tlscert=server-cert.pem --tlskey=server-key.pem -H=0.0.0.0:2376
我得到的信息日志是“
API监听[:]:2376

当我使用以下命令时:

docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H=$HOST:2376 version
我得到了适当的回应

但当我重新加载守护进程并尝试启动docker时,它会显示无法启动docker,并给出以下消息-

Job for docker.service failed because the control process exited with error code.  
See "systemctl status docker.service" and "journalctl -xe" for details.
“journalctl-xe”的输出为:

我已将必要的证书复制到
~/.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是我的主机名,我将其设置为“主机”环境变量

我认为问题在于我在创建客户端证书时选择的“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
变量。

您的图片不会显示完整的错误行,但如果错误消息是:

 pid file found, ensure docker is not running or delete /var/run/docker.pid
尝试删除pid,然后重新启动。
还要仔细检查您的,以及它的

x509:证书对$HOST有效,而不是EL802

这意味着证书是使用字符串$HOST而不是其实际值创建的

openssl req -subj '/CN=$HOST'

单引号的强引号将阻止shell用其值替换
$HOST
。使用双引号。

谢谢您的pid问题。拍照时那是个错误。我已经编辑了这个问题。我的主要问题实际上是在为服务器/客户端创建CSR时选择的CN名称。但是我不知道当我使用一个不属于任何域(ex-X.X.com)的简单VM时,服务器/客户机的FQDN名称(例如CN名称)应该是什么。感谢解决方案,但它给出了一个新的错误。不确定我是否应该为此创建一个新问题。现在,如果我尝试连接API,我会得到以下警告,这非常奇怪。$curl https://$HOST:2376/images/json\>--cert~/.docker/cert.pem\>--key~/.docker/key.pem\>--cacert~/.docker/ca.pem curl:(51)SSL:certificate subject name(EL802)与目标主机名“EL802”不匹配@zamansakib是的,关闭此问题(接受)并使用返回到此问题的链接提出新问题将更容易管理。