写点什么

TLS 加密远程连接 Docker

  • 2021 年 11 月 11 日
  • 本文字数:1994 字

    阅读完需:约 7 分钟

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


  1. 生成签名过的客户端证书(期间会要求输入密码 1234):


openssl x509 -req -days 1000 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf


  1. 将多余的文件删除:


rm -rf ca.srl client.csr extfile.cnf se


【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


rver.csr


  1. 此时还剩以下文件:


| 文件名 | 作用 |


| --- | --- |


| ca.pem | CA 机构证书 |


| ca-key.pem | 根证书 RSA 私钥 |


| cert.pem | 客户端证书 |


| key.pem | 客户私钥 |


| server-cert.pem | 服务端证书 |


| server-key.pem | 服务端私钥 |


至此,所有证书文件制作完成,接下来对 Docker 做 TLS 安全配置;

Docker 的 TLS 连接设置(A 机器)

  1. 打开文件/lib/systemd/system/docker.service,找到下图红框中的内容:



  1. 将上图红框中的一整行内容替换为以下内容:


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 \


  1. 加载上述配置,再重启 docker 服务:


systemctl daemon-reload && systemctl restart docker


配置完成,接下来验证远程 TLS 连接。

验证远程 TLS 连接(B 机器)

  1. 假设前面我们操作的电脑为 A,IP 地址是 192.168.121.138;

  2. 现在再准备一台电脑 B,IP 地址是 192.168.121.132,用来验证 TLS 加密远程连接 A 上的 Docker;

  3. 在 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


  1. 在制作证书时没有允许通过 IP 访问服务端,所以 B 在连接 A 的 Docker 时不能直接用 A 的 IP,所以要用 host 来访问 A,给 B 电脑增加一个 host 配置(如果 B 电脑是 Linux,就在/etc/hosts 文件上配置):


192.168.121.138 docker-daemon


  1. 在 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


  1. 不用证书连接试试,各种尝试都失败了:


[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 远程连接是,本文能给您提供参考。

欢迎关注我的公众号:程序员欣宸

评论

发布
暂无评论
TLS加密远程连接Docker