Pre

Transport Layer Security (TLS) 是目前互联网一种重要的安全加密技术,用于两个应用程序之间提供保密性和数据完整性。
本文记录一下TLS协议的流程,与网络结构等内容无关。
其流程主要分为握手阶段和通信阶段。

密钥协商 – Handshake

握手主要分四步
ClientHello、SeverHello、Certificate Verify、Server Finish

1.客户端发出请求(ClientHello)

由于不同设备对于加解密算法的支持程度不同,首先告知服务器支持的协议和算法,以及生成密钥的随机数。

在这一步客户端向服务器提供

  • 支持的协议版本,比如TLS 1.2版
  • 一个客户端生成的随机数A,稍后用于生成”对话密钥”
  • 支持的加密方法,比如RSA公钥加密
  • 支持的压缩方法

2.服务器回应(SeverHello)

服务器首先要回应客户端发的请求,确认协议和算法。之后和客户端一样,服务端也要提供一个随机数用于生成密钥,最后要提供服务器的证书,如果有认证客户端的需求,也可以请求客户端提供证书。最后服务端会发送一个Server Hello Done消息给客户端,表示Server Hello消息结束了。

  • 确认使用的加密通信协议版本,比如TLS 1.2版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信
  • 一个服务器生成的随机数B,稍后用于生成”对话密钥”
  • 确认使用的加密方法,比如RSA公钥加密
  • 服务器证书

3.客户端回应(Certificate Verify)

这一次客户端的回复将包含以下内容

  • 一个随机数C。该随机数用服务器公钥加密,防止被窃听
  • 编码改变通知(ChangeCipherSpec),表示随后的信息都将用双方商定的加密方法和密钥发送
  • 客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供服务器校验

ChangeCipherSpec其实就是一个校验位,当客户端准备好加解密环境后告诉服务端,之后的数据就用约定的加密算法来加密了。
最后的握手结束通知也是对加解密环节的正确性验证。

4.服务器最后回应(Server Finish)

服务器最后的回复包含

  • 编码改变通知(ChangeCipherSpec),表示随后的信息都将用双方商定的加密方法和密钥发送。
  • 服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供客户端校验。

通信

在握手结束后服务器和客户端进行正常的HTTP通信,不过其中的信息都是用三个随机数产生的密钥加密的

Refer

http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html
https://segmentfault.com/a/1190000002554673