Docker

时间:2016-11-18 00:15:11

标签: ssl docker https

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

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

在我运行

后,在docker文档中跟踪整个过程
sudo dockerd --tlsverify --tlscacert=ca.pem --tlscert=server-cert.pem --tlskey=server-key.pem -H=0.0.0.0:2376

我收到了#34; API listen on [::]:2376"

的INFO日志

当我使用以下命令时:

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'的输出是:
enter image description here

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

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 个答案:

答案 0 :(得分: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'

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