Docker Remote API TLS 认证

首先安装好Docker,开启远程访问(这一步如果没有做好的话先去google一下)。

默认Docker是不提供远程访问的认证的。

这里提供其中一种TLS认证方式的配置。
如果比较懒,可以直接将下面的命令复制到一个文件中,然后执行就行了。其中$VAR表示变量,需要改成你自己的IP。

openssl genrsa -aes256 -out ca-key.pem 4096
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
openssl genrsa -out server-key.pem 4096
openssl req -subj "/CN=$VAR" -sha256 -new -key server-key.pem -out server.csr
echo subjectAltName = DNS:$VAR,IP:127.0.0.1 > extfile.cnf
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
openssl genrsa -out key.pem 4096
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
echo extendedKeyUsage = clientAuth > extfile.cnf
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf
rm -v client.csr server.csr
chmod -v 0400 ca-key.pem key.pem server-key.pem
chmod -v 0444 ca.pem server-cert.pem cert.pem

第一个ca-key.perm 生成时可能需要你输入一个密码,随便就可以了,只要记得住。
然后一路回车。

(此处有坑,不能一路回车,CN必须填写,上面的$VAR也不能是IP,在配置jenkins docker插件时发现,详见另外一篇Jenkins Docker 插件TLS认证配置的文章)

生成完成后配置下docker.service
我的机器上在/lib/systemd/system/docker.service,每个机器可能不一样,自己找找吧。
更改ExecStart所在行为:

ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -D -H tcp://0.0.0.0:2375 --tlsverify --tlscacert=/root/.docker/ca.pem --tlscert=/root/.docker/server-cert.pem --tlskey=/root/.docker/server-key.pem

上面ca.pem,server-cert.pem,server-key 均为我们刚刚自己生成的文件。并且我是将文件放到了/root/.docker下。其他目录也可以,你自己看心情。这个地方路径不要错了,否者docker.service 启动不了。

上面文件编辑保存后执行,以下命令重载配置重启服务:

systemctl daemon-reload
service docker restart

测试:

然后将剩下的几个pem文件发送到客户端。随便你怎么发送。我这里采取scp:

scp -v /root/ca/{ca,cert,key}.pem larry@172.20.20.24:/home/larry/

上面发送了ca.pem,cert.pem,key.pem 到我的另外一个台机器的/home/larry下。

然后在另外一台机器执行如下命令测试:

curl https://docker所在机器ip:2375/info --cert ./cert.pem --key ./key.pem --cacert ./ca.pem

如果你能成功看到一个json字符串,就表示成功了。
如果你看到的是curl: (35) gnutls_handshake() failed: Certificate is bad
那你自己好好反省一下为什么吧!~

推荐阅读更多精彩内容