TLS中很重要的一点是密钥协商,它需要client、server在不预先定义任何密钥的情况下,在不安全的网络中协商出仅双方才知道的密钥,进而后续通讯使用该密钥加密。因此Key Exchange是整个tls的核心部分。
下面是一次完整的tls数据交互
ClientHello
ClientHello一般包含以下数据:
cipher_suites:
client支持的加密签名算法
TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA,TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA …
random:
client产生的随机数
ServerHello
cipher_suite:
server从client上送的加密套件列表中选择一个,并返给client
random:
server产生的随机数
Server Certificate
该部分包含服务端证书公钥以及证书链,客户端依此来校验服务端是否合法
Server Key Exchange Message
假设双方采用Diffie-Hellman算法交换密钥。server产生一个安全数y, 另外两个大数p,g,将( p,g,pubKey_A=g^y mod p)发送给client,同时会附带改部分的签名。
Server Hello Done Message
告诉client server端处理完成,等待你响应
Client Key Exchange Message
1、client在收到server的p,g,pubKey_A后,也生成一个安全数x,并将pubKey_B=g^x mod p返给server。
2、双方根据交换的参数计算出相同的premaster_secret
3、client: premaster_secret=pubKey_A^x mod p server: premaster_secret=pubkey_B^y mod p 然后再计算出master_secret master_secret = PRF(premaster_secret, “master secret”, client_random + server_random, 48) client_random,server_random为双方在hello中交换的值
4、最终得到key key = PRF(master_secret,”key expansion”,server_random+client_random) 其中PRF为双方协商的摘要算法
Change Cipher Spec Message
client发送该消息握手完成,server在接到该消息之后,认为后续所有的消息都是加密传输的。
Encrypted Handshake Message(Client)
这一步对应的是 Client Finish 消息,客户端将前面的握手消息生成摘要再用协商好的秘钥加密,这是客户端发出的第一条加密消息。服务端接收后会用秘钥解密,能解出来说明前面协商出来的秘钥是一致的。
Change Cipher Spec(Server)
这一步是服务端通知客户端后面再发送的消息都会使用加密,也是一条事件消息。
Encrypted Handshake Message(Server)
这一步对应的是 Server Finish 消息,服务端也会将握手过程的消息生成摘要再用秘钥加密,这是服务端发出的第一条加密消息。客户端接收后会用秘钥解密,能解出来说明协商的秘钥是一致的。
可以看到在进行应用数据传输前,client和server要进行两个轮回的数据交互,因此对比http,https延迟会明显增多几百毫秒,对于2G,iot等低速网络延迟感尤为明显。以上是tls1.2的流程,tls1.3对此进行了重新设计,完整的密钥交换仅需一次轮回就能完成。
WireShark TLSv1.2交互抓包截图
关于服务器返回的New Session Ticket消息:
1:客户端发起 client hello,拓展中带上空的 session ticket TLS,表明自己支持 session ticket。
2:服务器在握手过程中,如果支持 session ticket,则发送 New session ticket 类型的握手报文,其中包含了能够恢复包括主密钥在内的会话信息,当然,最简单的就是只发送 master key。为了让中间人不可见,这个 session ticket 部分会进行编码、加密等操作。
3:客户端收到这个 session ticket,就把当前的 master key 和这个 ticket 组成一对键值保存起来。服务器无需保存任何会话信息,客户端也无需知道 session ticket 具体表示什么。
4:当客户端尝试会话复用时,会在 client hello 的拓展中加上 session ticket,然后服务器收到 session ticket,回去进行解密、解码能相关操作,来恢复会话信息。如果能够恢复会话信息,那么久提取会话信息的主密钥进行后续的操作。
TLSv1.2交互,启用SessionID的Winshark的抓包截图:
本文部分转载自:medium.com/@oryxx/rsa%…