TLS握手流程分析
在了解了TLS的协议分层结构之后,回过头来看我们所抓到的数据包,结合实际的数据包来了解一下TLS的握手流程以及握手过程中产生了哪些数据的交互,TLS的握手流程如下图所示:
4.1 客户端 —— Client Hello
首先是客户端发送了一个Client Hello报文:
从抓到的数据包来看,其握手层协议类型为Handshake,主要数据内容有以下几种:
Random: 一个客户端随机数,参与了SSL握手的 master key的计算、KDF计算、server_key_exchange的签名值的计算
Cipher Suites:加密套件 主要分为四个部分,以加密套件 { ECDHE-ECDSA-AES256-SHA384 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AES(256) Mac=SHA38 }为例,表示该加密套件适用于TLS1.2版本,秘钥交换算法为ECDH、认证算法为ECDSA、数据加密算法为AES(256)、MAC算法为SHA38
Compression Methods: TLS记录层协议锁使用的数据压缩算法
Extension: 扩展选项 因为TLS在HTTP之前,此时尚无HTTP请求头的概念,如果需要指定域名,则需要通过扩展选项server_name来指定
我们只需要大概了解这些字段的基本含义即可,涉及到密码学的东西有余力的情况下再去以点破面自行了解。
4.2 服务端 —— Server Hello
在客户端在收到客户端发来的Client Hello包之后,会返回一个Server Hello包给客户端
Server Hello包中包含服务端生成的Random随机数、TLS协议版本、Sesssion ID 和 数据压缩方法,最主要的是返回了服务端根据Client Hello中的参数最终选择的加密套件Cipher Suite。
4.3 服务端 —— Certificate、Server Key Exchange、Server Hello Done
服务端在返回了Server Hello数据包之后,紧接着向客户端返回自己的证书和一个 Server Key Exchange报文,用于秘钥协商,最后再发送一个Server Hello Done告诉客户端SSL第一次握手结束了。
服务端返回的证书应该说是一个证书链,如上图所示,可以看到服务端其实返回了两个证书。一般来说,服务端证书链通常配置成三级,【站点证书】——【中间证书】——【根证书】,根证书通常是内置在操作系统或者支持HTTPS的应用当中的,所以为了减少开销一般不会将根证书也返回。
【扩展】:TLS分为单向认证和双向认证两种,顾名思义单向认证就是只需要客户端去验证服务端的身份,而双向认证需要服务端也要验证客户端的请求,但是十分消耗资源,导致性能低下,所以一般都不会开启双向认证。如果开启了双向认证,服务端还需要在Server Hello Done之前发送一个CertificateRequest数据包,然后客户端在收到Server Hello Done数据包之后需要向服务端发送一个Certificate数据包。
4.4 客户端 —— Client Key Exchange、ChangeCipher Spec、Encrypted Handshake Message
客户端在收到服务端发送来的Sever Hello Done包之后,开始验证证书的有效性,如果证书有效之后,才会继续进行这一步。验证证书有效性主要包括:证书链是否可信、证书是否吊销、证书有效期、域名检验。
证书验证通过后,客户端向服务端发送的主要有这几个参数:
client_key_exchange: 客户端计算产生随机数字pre-master,并且用服务端公钥加密,发送给服务端,客户端以后具有自己的随机数A和服务端的随机数B,结合pre-master计算出协商得到的对称秘钥
change cipher spec:客户端通知服务器后续的同学新都采用协商的秘钥进行加密通信
encrypted handshake message: 计算前面向服务端发送的数据生成一个hash作为摘要,并且使用协商秘钥加密后,发送到服务端进行数据和握手验证
4.5 服务端 —— New Session Ticket,Change Cipher Spec、Encrypted Handshake Message
服务端在收到客户端的加密的pre - master后,通过自己的私钥解密,然后根据签名协商得到的随机数A和B生成协商秘钥,然后使用协商秘钥解密被加密的摘要,再将前面接收到的所有客户端发送过来的相关安全参数进行hash之后,比较两边的摘要是否相同,从而验证握手是否合法。验证通过之后向客户端发送以下几个数据包:
Change Cipher Spec: 服务端通知客户端后续的通信都采用协商秘钥进行加密
Encrypted Handshake Message:服务端也将自己已经发送给客户端的数据经过hash后再加密发送给客户端,让客户端进行有效性验证
4.6 安全连接建立,发送加密数据 —— Application Data
当客户端收到服务端传递过来的Encryted Handshake Message,使用协商秘钥解密并且验证有效后,则说明连接成功建立,之后的所有数据将使用协商秘钥进行加密:
如下图所示,加密后的数据通过TLS握手层的应用数据协议进行封装,发送给对:
至此TLS/SSL安全连接就已经建立。