Docker-TLS加密通讯:理论加实操

TLS介绍

●TLS是Https的安全基础,TLS协议可用于保护正常运行于TCP之上的任何应用协议的通信。TLS协议的有点在于它是与应用层协议无关的。高层的应用协议能透明地建立于TLS协议之上。

●TLS协议既用到了公钥加密技术又用到了对称加密技术,TLS地握手协议非常有效地让客户和服务端之间完成相互之间地身份认证,其主要过程如下所述:

  • 客户端向服务器传送TLS的协议的版本号、加密算法的种类,产生的随机数、以及其他服务器和客户端之间通信的各种信息。
  • 服务端向客户端传送TLS协议的版本号、加密算法的种类、随机数以及其他相关信息,同时服务器还将客户端传送自己的证书。
  • 客户利用服务器传过来的信息验证服务器的合法性。如果合法性没有通过,通信将断开;弱国合法性验证通过,将继续进行4。
  • 用户随机产生一个用于后面通信的“对称密码”,然后用服务器的公钥对其加密,然后将加密后的“预主密码”传给服务器。
  • 如果服务器要求客户的身份认证,用户可以建立一个随机数然后对其进行数据签名,将这个含有签名的随机数和客户自己的证书以及加密过的“预主密码”一起传给服务器
  • 服务器和客户端用相同的主密码,一个对称密钥用于TLS协议的安全数据通讯的加解密通信。同时在TLS通信过程中还要完成数据通信的完整性,防止数据通信中的各种变化。

CA证书理解?CA证书的作用

●CA证书顾名思义就是由CA(Certification Authority)机构发布的数字证书。要对CA证书完全理解及其作用,首先要理解SSL。SSL(security sockets layer,安全套接层)是为网络通信提供安全及数据完整性的一种安全协议。SSL3.0版本以后又被称为TLS。

●SSL位于TCP与各应用层之间,是操作系统向外提供的API。SSL如何保证网络通信的安全和数据的完整性呢?就是采用了两种手段:身份认证和数据加密。首先身份认证就需要用到CA证书了。先了解CA证书具体包括哪些内容:

  • 颁发者
  • 使用者
  • 版本
  • 签名算法
  • 签名哈希算法
  • 使用者
  • 公钥
  • 指纹
  • 指纹算法
    ……

● 上述中颁发者、使用者、版本等内容好理解,颁发者就是CA机构,下面会讲到。对于签名算法、签名哈希算法的理解,首先要先理解签名是什么东东?联系到实际情况,当我们向某机构提供报告时,往往在报告最后加上个人的名字,以表示该报告是我本人的。签名在网络通讯中的应用称为数字签名,当服务器向客户端发送信息时,会将报文生成报文摘要,同时对报文摘要进行hash计算,得到hash值,然后对hash值进行加密,然后将加密的hash值放置在报文后面,这个加密后的hash值就称为签名。服务器将报文、签名和数字证书一同发送给客户端。客户端收到这些信息后,会首先验证签名,利用签名算法对签名进行解密,得到报文摘要的hash值,然后将得到的报文生成报文摘要并利用签名hash算法生成新的hash值,通过对比这两个hash值是否一致,就能判断信息是否完整,是否是由真正的服务器发送的。可知签名有两个作用确认消息发送方可靠,确认消息完整准确。

●上面提到了hash值的加密,我们还需要理解SSL的加密机制,在使用SSL的网络通讯过程中,消息在请求和响应中都是加密传送的。首先要知道加密算法分为两种:对称加密和非对称加密。对称加密就是发送双发使用相同的密钥对消息进行加解密,常见的对称加密为DES、3DES,AES等。非对称加密是发送双方各自拥有一对公钥私钥,其中公钥是公开的,私钥是保密的。当发送方向接收方发送消息时,发送方利用接收方的公钥对消息进行加密,接收方收到消息后,利用自己的私钥解密就能得到消息的明文。其中非对称加密方法有RSA、Elgamal、ECC等。此处只是简单了说明了这两种加密机制的过程,若要深入理解它们的原理、过程请搜索相应的资料,很容易搜索到。

CA证书的身份验证

●好了,了解了签名原理和两种加密机制,我们继续理解网络通讯中是怎么利用CA证书进行身份认证的?客户端与服务端需要经过一个握手的过程才能完成身份认证,建立一个安全的连接。握手的过程如下:

  • 客户端访问服务器(比如:https://www.12306.cn),发送ssl版本、客户端支持的加密算法、随机数等消息。
  • 服务器向客户端发送ssl版本、随机数、加密算法、证书(证书出现了)等消息。
  • 客户端收到消息后,判断证书是否可信(如何判断可信,看下文介绍),若可信,则继续通信,发送消息包括:向服务器发送一个随机数,从证书中获取服务器端的公钥,对随机数加密;编码改变通知,表示随后信息都将使用双方协定的加密方法和密钥发送;客户端握手结束通知。
  • 服务器端对数据解密得到随机数,发送消息:编码改变通知,表示随后信息都将使用双方协定的加密方法和密钥发送。

●以上就是整个握手的过程,在第三步实际上就完成了身份的认证,第四、五步是进行密钥的商定,因为非对称加密算法对数据加密非常慢,效率低,而对称加密加密效率很高,因此在整个握手过程要生成一个对称加密密钥,然后数据传输中使用对称加密算法对数据加密。可知ssl整个握手过程包括身份认证、密钥商定。

配置TLS

一.前期环境搭建

1.服务端配置

[root@localhost ~]# setenforce 0   ##关闭防护系统
[root@localhost ~]# iptables -F
[root@localhost ~]# hostnamectl set-hostname fuwu  ##修改主机名方便区分
[root@localhost ~]# su
[root@fuwu ~]# systemctl start docker   ##开启容器

2.配置名称解析

[root@fuwu ~]# vim /etc/hosts
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.148.139 fuwu    ##名称为fuwu

3.客户端配置

[root@localhost ~]# setenforce 0
[root@localhost ~]# iptables -F
[root@localhost ~]# hostnamectl set-hostname kehu
[root@localhost ~]# su
[root@kehu ~]# systemctl start docker

4.客户端也添加主机名

[root@kehu ~]# vim /etc/hosts
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.148.139 fuwu    ##名称为fuwu

在这里插入图片描述

二.创建CA证书

1.回到服务端创建ca密钥,长度为256位;产生一个pem文件,字节大小为4096,密码为123456

[root@fuwu ~]# openssl genrsa -aes256 -out ca-key.pem 4096

在这里插入图片描述
家目录底下也产生一个pem文件

2.基于ca密钥创建CA证书,遵从x509标准,有限时效为1000天;指定密钥;用哈希256验证;给证书起一个标题名称“/CN=*”

[root@fuwu ~]# openssl req -new -x509 -days 1000 -key ca-key.pem -sha256 -subj "/CN=*" -out ca.pem

在这里插入图片描述

三.创建服务器证书

1.创建服务器私钥(自己会产生)

[root@fuwu ~]# openssl genrsa -out server-key.pem 4096   

在这里插入图片描述
2.签名私钥(只是中间的一个过程)

[root@fuwu ~]# openssl req -subj "/CN=*" -sha256 -new -key server-key.pem -out server.csr  

在这里插入图片描述
3.使用ca证书与私钥证书签名,输入密码123456

[root@fuwu ~]# openssl x509 -req -days 1000 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem   ##遵从x509标准,有限时效为1000天;指定密钥;用哈希256验证;借助CA证书,CA密钥,证书会由CA自动创建并输出

在这里插入图片描述

四.创建客户端证书

1.客户端的密钥也是由服务端帮忙生产的

[root@fuwu ~]# openssl genrsa -out key.pem 4096    ##生产客户端密钥

在这里插入图片描述
2.客户端密钥签名,需要刚刚创建的密钥签名

[root@fuwu ~]# openssl req -subj "/CN=client" -new -key key.pem -out client.csr   

在这里插入图片描述
3.创建配置文件,为了生产客户端证书

[root@fuwu ~]# echo "extendedKeyUsage=clientAuth" > extfile.cnf   ##为了告诉服务端,服务端即将要开启TLS验证,让服务端开启TLS验证

4.签名证书,输入密码,(需要签名客户端,CA证书,CA密钥)

[root@fuwu ~]# openssl x509 -req -days 1000 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf

在这里插入图片描述

[root@fuwu ~]# rm -rf ca.srl client.csr extfile.cnf server.csr   ##删除多余的配置文件
配置docker,在配置文件中加上一些地址
[root@fuwu ~]# vim /lib/systemd/system/docker.service
#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/c    ontainerd/containerd.sock
15 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/co    ntainerd/containerd.sock --tlsverify --tlscacert=/tls/ca    .pem --tlscert=/tls/server-cert.pem --tlskey=/tls/server    -key.pem -H tcp://0.0.0.0:2376 -H unix:///var/run/docker    .sock   ##添加新的文件
[root@fuwu ~]# mkdir /tls    ##创建存放证书的目录
[root@fuwu ~]# mv *.pem /tls   ##将文件都放到目录下
[root@fuwu ~]# ls /tls/
ca-key.pem  cert.pem  server-cert.pem
ca.pem      key.pem   server-key.pem
[root@fuwu ~]# systemctl daemon-reload   ##重新加载
[root@fuwu ~]# systemctl restart docker   ##重启服务

在这里插入图片描述
这时将证书拷贝到客户端

[root@fuwu tls]# scp ca.pem root@192.168.148.140:/etc/docker   ##ca文件
[root@fuwu tls]# scp cert.pem root@192.168.148.140:/etc/docker  ##cert文件
[root@fuwu tls]# scp key.pem root@192.168.148.140:/etc/docker   ##key文件

在这里插入图片描述

五.客户端验证可以使用服务端的docker

[root@fuwu tls]# docker pull nginx    ##服务端下载一个镜像

在这里插入图片描述

[root@kehu docker]# docker --tlsverify --tlscacert=ca.pem --tlskey=key.pem --tlscert=cert.pem -H tcp://fuwu:2376 images    ##客户端也可以查看到下载的镜像

在这里插入图片描述

[root@kehu docker]# docker --tlsverify --tlscacert=ca.pem --tlskey=key.pem --tlscert=cert.pem -H tcp://fuwu:2376 create -it nginx:latest /bin/bash    ##在客户端创建nginx容器
d86d7413476d095fedc7f73f83c0ddfcfd3e8039621f233918f1eaada0c4d040

回到服务端可以看到创建的容器
在这里插入图片描述
这样将相对应的证书复制到对方节点上就可以实现客户端和服务端容器的互通

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值