TLS握手协议分析与理解——某HTTPS请求流量包分析
字数 1932 2025-08-29 08:31:42
TLS/SSL握手协议详解与HTTPS流量分析
1. HTTPS基础概念
HTTPS (Hypertext Transfer Protocol Secure) 是在HTTP基础上通过SSL/TLS协议实现数据加密传输的安全协议,主要提供:
- 数据加密传输:防止数据在传输过程中被窃听
- 身份认证:验证网站服务器的真实性
- 数据完整性:防止数据在传输过程中被篡改
协议分层
加密后的数据传输路径:
应用层 -> SSL/TLS层 -> 传输层 -> 网络层 -> 数据链路层
2. TLS握手流程详解
完整的TLS握手过程包含以下步骤:
2.1 Client Hello
客户端发起握手请求,发送:
- 支持的协议版本(TLS 1.0/1.1/1.2等)
- 32字节随机数(用于生成主密钥)
- 会话ID(用于会话恢复)
- 支持的加密套件列表
- 支持的压缩方法
- 扩展数据(如SNI域名信息)
结构定义:
struct {
ProtocolVersion client_version;
Random random;
SessionID session_id;
CipherSuite cipher_suites<2..2^16-2>;
CompressionMethod compression_methods<1..2^8-1>;
select (extensions_present) {
case false: struct {};
case true: Extension extensions<0..2^16-1>;
};
} ClientHello;
2.2 Server Hello
服务端响应,发送:
- 确定的协议版本
- 32字节随机数
- 会话ID(若支持会话恢复)
- 选择的加密套件
- 选择的压缩方法
- 扩展数据
结构定义:
struct {
ProtocolVersion server_version;
Random random;
SessionID session_id;
CipherSuite cipher_suite;
CompressionMethod compression_method;
select (extensions_present) {
case false: struct {};
case true: Extension extensions<0..2^16-1>;
};
} ServerHello;
2.3 Server Certificate
服务端发送证书链,包含:
- 网站证书
- 中间CA证书
- 根CA证书(通常不发送,客户端内置)
证书内容:
- 版本号
- 序列号
- 签名算法标识符
- 签发机构名
- 有效期
- 证书用户名
- 公钥信息
- 扩展项
- 签名值
2.4 Server Key Exchange
服务端发送密钥交换参数:
- 密钥交换算法公钥(如ECDHE的公钥)
- 椭圆曲线参数
- 签名(用于验证数据完整性)
2.5 Server Hello Done
服务端通知客户端已完成初始握手消息发送。
2.6 Client Key Exchange
客户端生成并发送密钥交换参数:
- 客户端公钥(如ECDHE的公钥)
密钥协商过程(以ECDHE为例):
- 双方确定椭圆曲线参数(E, N, G)
- 服务端生成随机数a,计算A = a*G,发送A
- 客户端生成随机数b,计算B = b*G,发送B
- 双方计算预主密钥:
- 客户端:Q = bA = b(a*G)
- 服务端:Q' = aB = a(b*G)
- Q = Q',完成密钥协商
2.7 Client Change Cipher Spec
客户端通知服务端将开始加密通信。
2.8 Client Finished
客户端发送加密的验证数据,包含:
verify_data = PRF(master_secret, "client finished", Hash(handshake_messages))
2.9 Server Change Cipher Spec
服务端通知客户端将开始加密通信。
2.10 Server Finished
服务端发送加密的验证数据,包含:
verify_data = PRF(master_secret, "server finished", Hash(handshake_messages))
2.11 Application Data
双方使用协商的对称密钥加密传输应用数据。
3. 密钥生成过程
- 预主密钥(PreMasterSecret):通过密钥交换算法协商得到
- 主密钥(MasterSecret):
MasterSecret = PRF(PreMasterSecret, "master secret", Client.random || Server.random)[0..47] - 密钥块(KeyBlock):
KeyBlock包含实际用于对称加密的密钥材料KeyBlock = PRF(MasterSecret, "key expansion", Server.random || Client.random)
4. 证书验证机制
证书校验步骤:
- 检查证书链是否由可信CA签发
- 使用CA公钥解密签名值,得到摘要A
- 计算证书信息的摘要B
- 比较摘要A和B是否一致
- 检查证书有效期、域名匹配等
证书信任链:
根CA证书 -> 中间CA证书 -> 网站证书
5. 会话恢复机制
5.1 Session ID方式
- 客户端在ClientHello中携带上次会话ID
- 服务端从内存查找会话状态
- 若找到则快速恢复,否则完整握手
5.2 Session Ticket方式
- 服务端加密会话状态发送给客户端
- 客户端下次握手时携带Ticket
- 服务端解密Ticket恢复会话状态
Ticket存储内容:
struct {
ProtocolVersion protocol_version;
CipherSuite cipher_suite;
CompressionMethod compression_method;
opaque master_secret[48];
ClientIdentity client_identity;
uint32 timestamp;
} StatePlaintext;
6. 加密套件组成
典型加密套件格式:TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
包含:
- 密钥交换算法:ECDHE
- 认证算法:RSA
- 加密算法:AES-128-GCM
- 消息认证码算法:SHA256
7. 安全性考虑
虽然TLS协议本身设计安全,但实现中可能出现漏洞:
- 心血漏洞(Heartbleed)
- 中间人攻击
- DROWN攻击
- FREAK漏洞
- POODLE攻击
8. 协议演进
- TLS 1.3删除了ChangeCipherSpec等冗余步骤
- TLS 1.3移除了压缩支持(因CRIME/BREACH攻击)
- 密钥交换算法优化,提高前向安全性
9. 实际流量分析要点
分析HTTPS流量时需关注:
- ClientHello中的加密套件列表和扩展
- ServerHello中选择的加密套件
- 证书链的完整性和验证过程
- 密钥交换参数和算法
- Finished消息的验证数据
通过深入理解TLS握手过程,可以更好地分析HTTPS通信的安全性,识别潜在的安全问题,并为安全配置和调优提供依据。