程序员都在学的docker--docker安全TLS验证(ca证书、服务端证书、客户端证书)

一、 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环境

实验参数

主机名IP地址
master14.0.0.110
client14.0.0.107

实验过程

1. 修改主机的前置环境

master主机的前置环境

[root@localhost ~]# mkdir tls
[root@localhost ~]# cd tls/
[root@localhost tls]# hostnamectl set-hostname master   ##设置主机名为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

2. 创建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

3. 创建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

4. 创建服务端私钥

[root@master tls]# openssl genrsa -out server-key.pem 4096
    genrsa     ##非对称秘钥  
    -out       ##输出名字
[root@master tls]# ls
ca-key.pem  ca.pem  server-key.pem

5. 给服务端私钥签名

[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

6. 使用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

7. 生成客户私钥

[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

8. 给客户端证书签名

[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

9. 创建配置文件

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

11. 整理证书

删除多余文件(这些都是制作的材料,认证过程中没有作用)

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 服务端私钥

12. 配置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

13. 传输证书,进行验证

[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

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值