Chrome
+ Wireshark
抓 SSL/TLS
包
- 添加环境变量
SSLKEYLOGFILE
= yourpath/key.log,使Chrome
保存每次https会话的key - 在
Wireshark·Preferences·Protocols·TLS
中配置key.log的位置
TLS v1.2 握手协商流程
抓包分析TLS v1.2(并不全面,也不深入,因为好奇,所以看看)
1.客户端请求 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
- Random: 服务端随机数(将加入密钥计算)
- Cipher Suite:服务端从客户端支持的加密套件中选择的加密套件
- Extension: session_ticket :服务端支持session_ticket,后续将发送New Session Ticket消息
-
Certificate:证书(会返回证书链上的证书,包括服务端证书,中间CA证书,根CA证书)
证书内容
- signedCertificate:证书明文内容(包含唯一序列号、域名、服务器公钥等信息)
- algorithmIdentifier:认证该证书使用的签名算法(若客户端不支持会导致握手失败)
- encrypted:证书明文经过签名后使用 CA私钥加密的密文
证书验证过程:拿出CA公钥(一般在浏览器内置)对密文进行解密得到摘要x,根据签名算法对证书明文进行摘要得到摘要y,最后对比摘要x y。(证书链上的证书都会进行验证,最后验证到浏览器内置的根证书)
-
Server Key Exchange
根据协商的加密套件,可能会发送Server Key Exchange消息,主要用于传递一些证书中不包含的,加密套件需要的信息(Diffie-Hellman参数)
-
Server Hello Done
告知客户端,服务端已发送完关于密钥交换的所有数据,客户端可以做证书校验、密钥计算
3.客户端响应 Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message
-
Client Key Exchange
发送用服务器公钥加密后的预备主密钥(或者Diffie-Hellman参数用于协商一致的预备主密钥),用于服务器计算会话的对称加密密钥(由前面的客户端随机数+服务端随机数+预备主密钥计算得到)。
-
Change Cipher Spec
告知服务端改变加密方式从非对称加密到对称加密
-
Encrypted Handshake Message (其实就是Finished消息加密,之所以会这样,这是因为从Change Cipher Spec后,客户端所有的消息都会使用会话密钥做对称性加密)
用于做数据完整性保护(密钥正确性确认),客户端会将握手过程中发送和接收的数据做哈希+
PRF
计算,然后用会话密钥加密给服务端做校验
4.服务端 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了。
基于Session Ticket 的快速恢复
1.客户端请求 Client Hello
在Client Hello 中会携带保存的Session Ticket + Session ID(还有新的Client Random)
2.服务端响应 Server Hello, Change Cipher Spec, Encrypted Handshake Message
服务端在接收到session ticket 后,会进行计算校验(比如用ticket_lifetime_hint判断是否过期),若服务端判断可以恢复会话,则会根据预备主密钥去生成新的会话密钥,然后会回复Server Hello(包含新的Server Random), Change Cipher Spec, Encrypted Handshake Message
其中Server Hello 会回复与Client Hello中相同的Session ID,表明会话恢复成功。
References
- https://ruanyifeng.com/blog/2014/09/illustration-ssl.html
- https://www.ruanyifeng.com/blog/2014/02/ssl_tls.html
- https://blog.cloudflare.com/announcing-keyless-ssl-all-the-benefits-of-cloudflare-without-having-to-turn-over-your-private-ssl-keys/
- https://blog.cloudflare.com/keyless-ssl-the-nitty-gritty-technical-details/
- https://github.com/halfrost/Halfrost-Field/blob/master/contents/Protocol/HTTPS-TLS1.2_handshake.md
- https://zhuanlan.zhihu.com/p/227873665
- https://zhuanlan.zhihu.com/p/227919397
- https://blog.csdn.net/mrpre/article/details/77868570