TLS 密匙协商过程简介

896 阅读3分钟

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%…

anribras.github.io/tech/2018/1…