HTTPS 握手过程
通过 Wireshark 抓包分析 HTTPS 完整的握手流程
问题
HTTPS 的握手过程是怎样的?
解答
HTTPS 在七层协议中属于应用层,基于 TCP 协议。完整的握手流程包括:TCP 三次握手 → 对称密钥协商 → 正常收发数据。
抓包准备
使用 Wireshark 抓包工具,执行以下命令:
curl https://www.baidu.com
为什么选择 Wireshark?
Fiddler 和 Charles 主要抓取应用层数据(连接建立后),而 Wireshark 直接读取网卡数据,可以抓取所有协议的数据包,包括连接建立前的过程。
为什么用 curl?
curl 只发送一个请求,浏览器打开页面会加载各种资源,产生大量不必要的数据包。
握手流程
第一步:TCP 三次握手
建立 TCP 连接,这是 HTTPS 握手的前提。
第二步:客户端发送 Client Hello
客户端发送 Client Hello 消息,包含:
- TLS 版本信息
- 随机数 random_C(用于后续密钥协商)
- 加密套件候选列表
- 压缩算法候选列表
- 扩展字段
第三步:服务端发送 Server Hello
服务端返回协商结果:
- 选择的 TLS 协议版本
- 选择的加密套件 cipher suite
- 选择的压缩算法 compression method
- 随机数 random_S
第四步:服务端发送证书
服务端发送 SSL 证书。由于证书报文长度较大(如 3761 字节),TCP 层会进行分段传输。
第五步:服务端发送 Server Key Exchange(可选)
仅在使用 DHE/ECDHE 非对称密钥协商算法时发送。RSA、DH、ECDH 算法不发送此报文。
第六步:服务端发送 Server Hello Done
通知客户端服务端握手消息发送完毕。
第七步:客户端发送密钥交换信息
包含三个部分:
- Client Key Exchange:发送客户端公钥参数,此时客户端已计算出密钥
- Change Cipher Spec:通知服务器后续通信使用协商的密钥和加密算法
- Encrypted Handshake Message:测试密钥的有效性和一致性
第八步:服务端发送 New Session Ticket
服务器创建会话,在超时时间内双方使用协商的密钥通信。
第九步:服务端发送 Change Cipher Spec
服务端解密客户端参数,计算出协商密钥,验证 Encrypted Handshake Message 的有效性后,通知客户端可以使用协商密钥通信。
第十步:服务端发送 Encrypted Handshake Message
验证客户端能正常解密,服务端能正常加密。
第十一步:开始传输加密数据
密钥协商完成,使用对称加密传输数据。
第十二步:TCP 四次挥手
数据传输完成后,通过 TCP 四次挥手关闭连接。
关键点
- HTTPS 握手必须先完成 TCP 三次握手
- 客户端和服务端各生成一个随机数,用于协商对称密钥
- 服务端发送证书供客户端验证身份
- Server Key Exchange 是否发送取决于加密算法(DHE/ECDHE 需要,RSA 不需要)
- 双方通过 Change Cipher Spec 和 Encrypted Handshake Message 确认密钥协商成功
目录