TLS v1.2 抓包分析

"TLS v1.2 抓包分析"

Posted by tablesheep on January 10, 2022

Chrome + WiresharkSSL/TLS

  • 添加环境变量SSLKEYLOGFILE = yourpath/key.log,使Chrome保存每次https会话的key
  • Wireshark·Preferences·Protocols·TLS中配置key.log的位置

TLS v1.2 握手协商流程

抓包分析TLS v1.2(并不全面,也不深入,因为好奇,所以看看)

1.客户端请求 Client Hello

Client Hello

  • Random: 客户端随机数(将加入密钥计算)
  • Cipher Suites:客户端支持的加密套件
  • Compression Methods:客户端支持的压缩方法
  • Extension: session_ticket :客户端表明支持session_ticket快速恢复
  • Extension: signature_algorithms: 客户端支持的签名算法

2.服务端响应 Server Hello,Certificate, Server Key Exchange, Server Hello Done

消息内容可能会合并返回,这也是一种优化。

  • Server Hello

    Server Hello

    • Random: 服务端随机数(将加入密钥计算)
    • Cipher Suite:服务端从客户端支持的加密套件中选择的加密套件
    • Extension: session_ticket :服务端支持session_ticket,后续将发送New Session Ticket消息
  • Certificate:证书(会返回证书链上的证书,包括服务端证书,中间CA证书,根CA证书)

    证书内容

    Certificate

    • signedCertificate:证书明文内容(包含唯一序列号、域名、服务器公钥等信息)
    • algorithmIdentifier:认证该证书使用的签名算法(若客户端不支持会导致握手失败)
    • encrypted:证书明文经过签名后使用 CA私钥加密的密文

证书验证过程:拿出CA公钥(一般在浏览器内置)对密文进行解密得到摘要x,根据签名算法对证书明文进行摘要得到摘要y,最后对比摘要x y。(证书链上的证书都会进行验证,最后验证到浏览器内置的根证书)

  • Server Key Exchange

    Server Key Exchange

    根据协商的加密套件,可能会发送Server Key Exchange消息,主要用于传递一些证书中不包含的,加密套件需要的信息(Diffie-Hellman参数)

  • Server Hello Done

Server Hello Done

告知客户端,服务端已发送完关于密钥交换的所有数据,客户端可以做证书校验、密钥计算

3.客户端响应 Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message

  • Client Key Exchange

    Client Key Exchange

    发送用服务器公钥加密后的预备主密钥(或者Diffie-Hellman参数用于协商一致的预备主密钥),用于服务器计算会话的对称加密密钥(由前面的客户端随机数+服务端随机数+预备主密钥计算得到)。

  • Change Cipher Spec

    Change Cipher Spec, Encrypted Handshake Message

    告知服务端改变加密方式从非对称加密到对称加密

  • Encrypted Handshake Message (其实就是Finished消息加密,之所以会这样,这是因为从Change Cipher Spec后,客户端所有的消息都会使用会话密钥做对称性加密)

    用于做数据完整性保护(密钥正确性确认),客户端会将握手过程中发送和接收的数据做哈希+PRF计算,然后用会话密钥加密给服务端做校验

4.服务端 New Session Ticket, Change Cipher Spec, Encrypted Handshake Message

 New Session Ticket, Change Cipher Spec, Encrypted Handshake Message

  • New Session Ticket

    服务端发送的session ticket (由服务端计算出的包含了能够恢复包括主密钥在内的会话信息)用于会话快速恢复,客户端会根据服务端 ip + port 将session ticket 与预备主密钥保存。

  • Change Cipher Spec

    跟客户端Change Cipher Spec 一样,告知客户端从这条消息后的消息都使用会话密钥加密

  • Encrypted Handshake Message

    与客户端Encrypted Handshake Message类似,服务端把握手过程中发送和接收的数据计算加密后给客户端校验

至此握手阶段便结束了,后续就是用会话密钥加密的Application Data了。

Application Data

基于Session Ticket 的快速恢复

1.客户端请求 Client Hello

Session Ticket Client Hello

在Client Hello 中会携带保存的Session Ticket + Session ID(还有新的Client Random)

2.服务端响应 Server Hello, Change Cipher Spec, Encrypted Handshake Message

Session Ticket Server Hello

服务端在接收到session ticket 后,会进行计算校验(比如用ticket_lifetime_hint判断是否过期),若服务端判断可以恢复会话,则会根据预备主密钥去生成新的会话密钥,然后会回复Server Hello(包含新的Server Random), Change Cipher Spec, Encrypted Handshake Message

其中Server Hello 会回复与Client Hello中相同的Session ID,表明会话恢复成功。

References