一、 Docker-TLS加密通讯
1.1 TLS介绍
TLS (Transport Layer Security)指传输层安全,是解决网络安全的重量级武器。传输层安全最早由网景公司所开发,那时的名字还不叫TLS,而是SSL(Secure Sockets Layer),即安全套接字层。
TLS 加密通讯: 为了防止链路劫持、会话劫持等问题导致 Docker 通信时被中间人攻击,C/S 两端应该通过加密方式通讯。
TLS协议的优势: TLS协议的优势是与高层的应用层协议(如HTTP、FTP、Telnet等)无耦合。应用层协议能透明地运行在TLS协议之上,由TLS协议进行创建加密通道需要的协商和认证。应用层协议传送的数据在通过TLS协议时都会被加密,从而保证通信的私密性
1.2 CA证书
证书颁发机构(CA, Certificate Authority)即颁发数字证书的机构。是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。
CA 证书颁发的时候,证书中是包含密钥对的,同时用户信息也是进行加密的,所以CA颁发的证书具有两个特点:用户发送的信息都是加密的;身份的唯一性。
证书创建流程
创建证书有三步
1.设置私钥 确保安全加密
2.私钥签名 确保身份真实不可抵赖
3.制作证书
服务端:ca密钥(ca-key.pem) ----》ca证书 (ca.pem ) ----》服务器私钥(server-key.pem)----》服务器私钥签名(server.csr)----》最后通过ca密钥、ca证书、服务端私钥签名-生成服务端证书(server-cert.pem)
客户端 :私钥(key.pem )----》私钥签名(client.csr)----》ca 密钥----》ca密钥证书----》客户端签名证书(cert.pem)
服务端签名证书server-cert.pem----(ca 密钥 、 ca 证书、服务端签名)
客户端签名证书cert.pem --------(ca 密钥 、 ca 证书、服务端签名)
二、 TLS加密通讯实操
VMware中两台centos7虚拟机,虚拟机部署docker环境
实验参数
主机名
master 14.0.0.110
client 14.0.0.107
实验过程
- 修改主机的前置环境:master主机的前置环境
[root@localhost ~]# mkdir tls
[root@localhost ~]# cd tls/
[root@localhost tls]# hostnamectl set-hostname master ##设置主机名
[root@localhost tls]# su
[root@master tls]# vim /etc/hosts ##写入hosts文件,便于解析127.0.0.1 master
client主机的前置环境
[root@localhost ~]# hostnamectl set-hostname client ##设置主机名为client
[root@localhost ~]# su
[root@client ~]# vim /etc/hosts ##将master的主机名和IP对应关系写入hosts文件
14.0.0.110 master
- 创建ca证书密钥
ca证书是所有一切证书的根本,也是根证书
创建ca证书秘钥 有了ca秘钥就可以创建证书了
[root@master tls]# openssl genrsa -aes256 -out ca-key.pem 4096 ##使用rsa非对称秘钥,位数256位,-out 输出密钥文件ca-key.pem
Enter pass phrase for ca-key.pem: ##输入自定义密码123123
Verifying - Enter pass phrase for ca-key.pem: ##输入自定义密码123123
aes:表示一个对称加密的一种形式
out:表示输出
.pem:表示一个证书
[root@master tls]# ls
ca-key.pem
- 创建ca证书
[root@master tls]# openssl req -new -x509 -days 1000 -key ca-key.pem -sha256 -subj "/CN=*" -out ca.pem
Enter pass phrase for ca-key.pem: ##输入CA秘钥密码123123就是秘钥的密码
req ##签名
-new -x509 ##使用国际标准x509
-days 1000 ##证书有效期
-key ca-key.pem ##指定证书名字
-sha256 ##指定哈希256位加密算法
-out ca.pem ##输出证书 名字ca.pam
-subj "/CN=*" ##项目名称
[root@master tls]# ls
ca-key.pem ca.pem
- 创建服务端私钥
[root@master tls]# openssl genrsa -out server-key.pem 4096
genrsa ##非对称秘钥
-out ##输出名字
[root@master tls]# ls
ca-key.pem ca.pem server-key.pem
- 给服务端私钥签名
[root@master tls]# openssl req -subj "/CN=*" -sha256 -new -key server-key.pem -out server.csr
req ##签名
-subj "/CN=*" ##项目名称
-sha256 ##哈希256位加密算法
-new -key server-key.pem ##指定服务器私钥文件名
-out server.csr ##前名后为.csr文件
[root@master tls]# ls
ca-key.pem ca.pem server.csr server-key.pem
-
使用ca证书与私钥证书签名
这时候生成的服务端证书就是最完整的服务端证书
[root@master tls]# openssl x509 -req -days 1000 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem
Signature ok
subject=/CN=*
Getting CA Private Key
Enter pass phrase for ca-key.pem: ##输入密码123123
x509 ##国际协议标准
-req ##签名
-days 1000 -sha256 ##有效时间1000天 用哈希算法
-in server.csr ##在服务器私钥
-CA ca.pem -CAkey ca-key.pem ##指定ca秘钥和ca证书
[root@master tls]# ls
ca-key.pem ca.pem ca.srl server-cert.pem server.csr server-key.pem
- 生成客户私钥
[root@master tls]# openssl genrsa -out key.pem 4096
Generating RSA private key, 4096 bit long modulus
....................++
..................................................++
e is 65537 (0x10001)
[root@master tls]# ls
ca-key.pem ca.srl key.pem server.csr
ca.pem server-cert.pem server-key.pem
- 给客户端证书签名
[root@master tls]# openssl req -subj "/CN=clinet" -new -key key.pem -out client.csr
[root@master tls]# ls
ca-key.pem ca.srl key.pem server.csr
ca.pem client.csr server-cert.pem server-key.pem
- 创建配置文件
echo extendedKeyUsage=clientAuth > extfile.cnf
扩展性的秘钥验证使用客户端验证这边连接时候输入密码验证
10. 创建客户端证书
[root@master tls]# openssl x509 -req -days 1000 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf
Signature ok
subject=/CN=clinet
Getting CA Private Key
Enter pass phrase for ca-key.pem: ##输入密码123123
[root@master tls]# ls
ca-key.pem ca.srl client.csr key.pem server.csr
ca.pem cert.pem extfile.cnf server-cert.pem server-key.pem
- 整理证书
删除多余文件(这些都是制作的材料,认证过程中没有作用)extfile.cnf 这个文件之所以被删除是因为再上一步产生证书的过程中已经使用过,之后不需要用到。
[root@master tls]# rm -rf ca.srl client.csr extfile.cnf server.csr
[root@master tls]# ls
ca-key.pem ca.pem cert.pem key.pem server-cert.pem server-key.pem
此时还剩下以下文件
:
ca.pem CA机构证书
ca-key.pem 根证书RSA私钥
cert.pem 客户端证书
key.pem 客户私钥
server-cert.pem 服务端证书
server-key.pem 服务端私钥
- 配置docker
[root@master tls]# vim /lib/systemd/system/docker.service
14行 原来的注释掉 换成下面的
ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/root/tls/ca.pem --tlscert=/root/tls/server-cert.pem --tlskey=/root/tls/server-key.pem -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock
其中:
--tlscacert=/root/tls/ca.pem ##指定ca证书路径
--tlscert=/root/tls/server-cert.pem ##指定服务端证书位置
--tlskey=/root/tls/server-key.pem ##指定服务端私钥位置
重载配置文件,重启服务
[root@master tls]# systemctl daemon-reload
[root@master tls]# systemctl restart docker
- 传输证书,进行验证
[root@master tls]# systemctl stop firewalld.service
[root@master tls]# setenforce 0
[root@master tls]# scp ca.pem root@14.0.0.107:/etc/docker/
[root@master tls]# scp cert.pem root@14.0.0.107:/etc/docker/
[root@master tls]# scp key.pem root@14.0.0.107:/etc/docker/
再client端进行验证
[root@client docker]# systemctl stop firewalld.service
[root@client docker]# setenforce 0
[root@client ~]# cd /etc/docker/
[root@client docker]# docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://master:2376 version
Client: Docker Engine - Community
Version: 19.03.13
API version: 1.40
Go version: go1.13.15
Git commit: 4484c46d9d
Built: Wed Sep 16 17:03:45 2020
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.13
API version: 1.40 (minimum version 1.12)
Go version: go1.13.15
Git commit: 4484c46d9d
Built: Wed Sep 16 17:02:21 2020
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.3.7
GitCommit: 8fba4e9a7d01810a393d5d25a3621dc101981175
runc:
Version: 1.0.0-rc10
GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd
docker-init:
Version: 0.18.0
GitCommit: fec3683
扩展阅读:
评论区