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

服务端发送证书链,包含:

  1. 网站证书
  2. 中间CA证书
  3. 根CA证书(通常不发送,客户端内置)

证书内容

  • 版本号
  • 序列号
  • 签名算法标识符
  • 签发机构名
  • 有效期
  • 证书用户名
  • 公钥信息
  • 扩展项
  • 签名值

2.4 Server Key Exchange

服务端发送密钥交换参数:

  • 密钥交换算法公钥(如ECDHE的公钥)
  • 椭圆曲线参数
  • 签名(用于验证数据完整性)

2.5 Server Hello Done

服务端通知客户端已完成初始握手消息发送。

2.6 Client Key Exchange

客户端生成并发送密钥交换参数:

  • 客户端公钥(如ECDHE的公钥)

密钥协商过程(以ECDHE为例)

  1. 双方确定椭圆曲线参数(E, N, G)
  2. 服务端生成随机数a,计算A = a*G,发送A
  3. 客户端生成随机数b,计算B = b*G,发送B
  4. 双方计算预主密钥:
    • 客户端: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. 密钥生成过程

  1. 预主密钥(PreMasterSecret):通过密钥交换算法协商得到
  2. 主密钥(MasterSecret)
    MasterSecret = PRF(PreMasterSecret, "master secret", Client.random || Server.random)[0..47]
    
  3. 密钥块(KeyBlock)
    KeyBlock = PRF(MasterSecret, "key expansion", Server.random || Client.random)
    
    KeyBlock包含实际用于对称加密的密钥材料

4. 证书验证机制

证书校验步骤:

  1. 检查证书链是否由可信CA签发
  2. 使用CA公钥解密签名值,得到摘要A
  3. 计算证书信息的摘要B
  4. 比较摘要A和B是否一致
  5. 检查证书有效期、域名匹配等

证书信任链:

根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

包含:

  1. 密钥交换算法:ECDHE
  2. 认证算法:RSA
  3. 加密算法:AES-128-GCM
  4. 消息认证码算法:SHA256

7. 安全性考虑

虽然TLS协议本身设计安全,但实现中可能出现漏洞:

  • 心血漏洞(Heartbleed)
  • 中间人攻击
  • DROWN攻击
  • FREAK漏洞
  • POODLE攻击

8. 协议演进

  • TLS 1.3删除了ChangeCipherSpec等冗余步骤
  • TLS 1.3移除了压缩支持(因CRIME/BREACH攻击)
  • 密钥交换算法优化,提高前向安全性

9. 实际流量分析要点

分析HTTPS流量时需关注:

  1. ClientHello中的加密套件列表和扩展
  2. ServerHello中选择的加密套件
  3. 证书链的完整性和验证过程
  4. 密钥交换参数和算法
  5. Finished消息的验证数据

通过深入理解TLS握手过程,可以更好地分析HTTPS通信的安全性,识别潜在的安全问题,并为安全配置和调优提供依据。

TLS/SSL握手协议详解与HTTPS流量分析 1. HTTPS基础概念 HTTPS (Hypertext Transfer Protocol Secure) 是在HTTP基础上通过SSL/TLS协议实现数据加密传输的安全协议,主要提供: 数据加密传输 :防止数据在传输过程中被窃听 身份认证 :验证网站服务器的真实性 数据完整性 :防止数据在传输过程中被篡改 协议分层 加密后的数据传输路径: 2. TLS握手流程详解 完整的TLS握手过程包含以下步骤: 2.1 Client Hello 客户端发起握手请求,发送: 支持的协议版本(TLS 1.0/1.1/1.2等) 32字节随机数(用于生成主密钥) 会话ID(用于会话恢复) 支持的加密套件列表 支持的压缩方法 扩展数据(如SNI域名信息) 结构定义 : 2.2 Server Hello 服务端响应,发送: 确定的协议版本 32字节随机数 会话ID(若支持会话恢复) 选择的加密套件 选择的压缩方法 扩展数据 结构定义 : 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 = b A = b (a* G) 服务端:Q' = a B = a (b* G) Q = Q',完成密钥协商 2.7 Client Change Cipher Spec 客户端通知服务端将开始加密通信。 2.8 Client Finished 客户端发送加密的验证数据,包含: 2.9 Server Change Cipher Spec 服务端通知客户端将开始加密通信。 2.10 Server Finished 服务端发送加密的验证数据,包含: 2.11 Application Data 双方使用协商的对称密钥加密传输应用数据。 3. 密钥生成过程 预主密钥(PreMasterSecret) :通过密钥交换算法协商得到 主密钥(MasterSecret) : 密钥块(KeyBlock) : KeyBlock包含实际用于对称加密的密钥材料 4. 证书验证机制 证书校验步骤: 检查证书链是否由可信CA签发 使用CA公钥解密签名值,得到摘要A 计算证书信息的摘要B 比较摘要A和B是否一致 检查证书有效期、域名匹配等 证书信任链: 5. 会话恢复机制 5.1 Session ID方式 客户端在ClientHello中携带上次会话ID 服务端从内存查找会话状态 若找到则快速恢复,否则完整握手 5.2 Session Ticket方式 服务端加密会话状态发送给客户端 客户端下次握手时携带Ticket 服务端解密Ticket恢复会话状态 Ticket存储内容 : 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通信的安全性,识别潜在的安全问题,并为安全配置和调优提供依据。