构建你的网络基础体系 - TLS的连接过程

HTTP由于是明文传输,客户端与服务端通信的信息都是肉眼可见的,随意使用一个抓包工具都可以截获通信的内容,例如WireShark

所以安全上存在以下三个风险:

  • 窃听风险,比如可以通信链路上获取通信内容。
  • 篡改风险,比如强制植入垃圾广告,视觉污染。
  • 冒充风险,比如冒充淘宝网站。

HTTPS是在HTTP的基础上使用SSL/TLS来加密报文,对窃听和中间人攻击提供合理的防护。

image.jpeg

总的通信过程可以分为三个阶段:

1、TCP的三次握手
2、TLS的连接
3、Http请求和响应

TCP的三次握手之前已经分析过,不太了解的同学可以先移步学习:构建你的网络知识体系 - TCP

本文主要讲解第二点:TLS的连接。

1、SSL/TLS是什么

TLS(Transport Layer Security),译为:传输层安全协议。前身是SSL(Secure Sockets Layer),译为:安全套接层。它工作在传输层与应用层之间。

image.jpeg

2、TLS的连接

TLS的连接也和TCP一样,有握手的过程,不过TLS需要进行四次握手。这四次握手又大概可以分为十个步骤:

image.jpeg

第一次握手

① Client Hello

客户端首先会发一个「Client Hello」消息,字面意思我们也能理解到,这是跟服务器「打招呼」。消息体里面包含的东西:

1、TLS的版本号。
2、支持的加密组件(Cipher Suite)列表。加密组件是指所使用的加密算法及密钥长度等。
3、一个随机数(Client Random)。

image.png

第二次握手

② Server Hello

这次是服务器发送一个「Server Hello」消息,服务器向客户端打招呼。消息体里面包含的东西:

1、TLS的版本号。
2、选择的加密组件。刚才客户端向服务器发送了支持的加密组件列表,这个选中的加密组件就是从那个列表中挑选出来的。
3、一个随机数(Server Random

image.png

③ Certificate

服务器向客户端发送CA签名过的公钥证书。

image.jpeg

④ Server Key Exchange

服务端向客户端发送用以实现ECDHE算法的一个参数(Server Params)。 为了防止伪造,Server Params经过了服务器私钥签名。

ECDHE是一种密钥交换算法。

image.png

⑤ Server Hello Done

告知客户端,第一次协商结束。

image.jpeg

目前为止,客户端和服务端之间通过明文共享了,Client Random,Server Random,Server Params。而且客户端也拿到了服务端的公钥证书,接下来客户端会校验公钥证书的有效性。

第三次握手

⑥ Client Key Exchange

客户端发送用以实现ECDHE算法的另一个参数(Client Params)。

image.jpeg

到目前为止,客户端和服务器都拥有了ECDHE算法需要的2个参数:Server Params、Client Params

客户端、服务器都可以使用ECDHE算法根据Server Params、Client Params计算出一个新的随机密钥串:Pre-master secret,然后结合Client Random、Server Random、Pre-master secret生成一个主密钥。 最后利用主密钥衍生出其他密钥:客户端发送用的会话密钥、服务器发送用的会话密钥等。

⑦ Change Cipher Spec

告知服务器,之后的通信会使用计算出来的会话秘钥进行加密。

image.jpeg

⑧ Finished(Encrypted Handshake Message)

包含连接至今全部报文的整体校验值(摘要),加密之后发送给服务器。

image.jpeg

这次握手协商是否成功,要以服务器是否能够正确解密该报文作为判定标准。

第四次握手

⑨ Change Cipher Spec

服务器同样发送Change Cipher Spec报文。

⑩ Finished(Encrypted Handshake Message)

服务器同样发送Finished报文。

3、总结

到此为止,若客户端、服务器的加密解密都被验证过没问题,TLS的握手过程将正式结束,后面将使用得到的会话秘钥加密HTTP请求和响应。

TLS四次握手所做的事情,概括起来就是:客户端和服务端互相协商,各自给出一些参数,经过ECDHE算法算出通信用的对称秘钥

猜你喜欢

转载自juejin.im/post/7016716130798534670