TLS 加密远程连接 Docker
openssl x509 -req -days 1000 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem
此时生成的 server-cert.pem 文件就是已盖章生效的服务端证书;
8. 生成客户私钥:
openssl genrsa -out key.pem 4096
此时生成的 key.pem 文件就是客户私钥;
9. 生成客户端证书签名请求:
openssl req -subj "/CN=client" -new -key key.pem -out client.csr
此时生成的 client.csr 文件就是客户端证书签名请求;
10. 生成名为 extfile.cnf 的配置文件:
echo extendedKeyUsage=clientAuth > extfile.cnf
生成签名过的客户端证书(期间会要求输入密码 1234):
openssl x509 -req -days 1000 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf
将多余的文件删除:
rm -rf ca.srl client.csr extfile.cnf se
rver.csr
此时还剩以下文件:
| 文件名 | 作用 |
| --- | --- |
| ca.pem | CA 机构证书 |
| ca-key.pem | 根证书 RSA 私钥 |
| cert.pem | 客户端证书 |
| key.pem | 客户私钥 |
| server-cert.pem | 服务端证书 |
| server-key.pem | 服务端私钥 |
至此,所有证书文件制作完成,接下来对 Docker 做 TLS 安全配置;
Docker 的 TLS 连接设置(A 机器)
打开文件/lib/systemd/system/docker.service,找到下图红框中的内容:
将上图红框中的一整行内容替换为以下内容:
ExecStart=/usr/bin/dockerd-current --tlsverify --tlscacert=/root/work/ca.pem --tlscert=/root/work/server-cert.pem --tlskey=/root/work/server-key.pem -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock \
加载上述配置,再重启 docker 服务:
systemctl daemon-reload && systemctl restart docker
配置完成,接下来验证远程 TLS 连接。
验证远程 TLS 连接(B 机器)
假设前面我们操作的电脑为 A,IP 地址是 192.168.121.138;
现在再准备一台电脑 B,IP 地址是 192.168.121.132,用来验证 TLS 加密远程连接 A 上的 Docker;
在 A 机器执行以下命令,将 A 上的 ca.pem、cert.pem、key.pem 这三个文件复制到 B 机器的/root/work 目录(请提前建好此目录):
scp /root/work/ca.pem root@192.168.121.132:/root/work \
&& scp /root/work/cert.pem root@192.168.121.132:/root/work \
&& scp /root/work/key.pem root@192.168.121.132:/root/work
在制作证书时没有允许通过 IP 访问服务端,所以 B 在连接 A 的 Docker 时不能直接用 A 的 IP,所以要用 host 来访问 A,给 B 电脑增加一个 host 配置(如果 B 电脑是 Linux,就在/etc/hosts 文件上配置):
192.168.121.138 docker-daemon
在 B 上执行以下命令,即可连接 A 的 Docker 服务:
docker --tlsverify --tlscacert=/root/work/ca.pem --tlscert=/root/work/cert.pem --tlskey=/root/work/key.pem -H tcp://docker-daemon:2376 version
控制台显示以下信息,其中 Server 部分就是 A 机器的 Docker 信息:
Client:
Version: 1.13.1
API version: 1.26
Package version: docker-1.13.1-102.git7f2769b.el7.centos.x86_64
Go version: go1.10.3
Git commit: b2f74b2/1.13.1
Built: Wed May 1 14:55:20 2019
OS/Arch: linux/amd64
Server:
Version: 1.13.1
API version: 1.26 (minimum version 1.12)
Package version: docker-1.13.1-102.git7f2769b.el7.centos.x86_64
Go version: go1.10.3
Git commit: 7f2769b/1.13.1
Built: Mon Aug 5 15:09:42 2019
OS/Arch: linux/amd64
Experimental: false
不用证书连接试试,各种尝试都失败了:
[root@centos7 work]# docker -H tcp://192.168.121.138:2375 images
Cannot connect to the Docker daemon at tcp://192.168.121.138:2375. Is the docker daemon running?
[root@centos7 work]# docker -H tcp://docker-daemon:2375 images
Cannot connect to the Docker daemon at tcp://docker-daemon:2375. Is the docker daemon running?
[root@centos7 work]# docker -H tcp://192.168.121.138:2376 images
Get http://192.168.121.138:2376/v1.26/images/json: net/http: HTTP/1.x transport connection broken: malformed HTTP response "\x15\x03\x01\x00\x02\x02".
Are you trying to connect to a TLS-enabled daemon without TLS?
[root@centos7 work]# docker -H tcp://docker-daemon:2376 images
Get http://docker-daemon:2376/v1.26/images/json: net/http: HTTP/1.x transport connection broken: malformed HTTP response "\x15\x03\x01\x00\x02\x02".
Are you trying to connect to a TLS-enabled daemon without TLS?
至此,TLS 加密远程连接 Docker 的实战就完成了,希望您在设置安全的 Docker 远程连接是,本文能给您提供参考。
评论