3. TLS 协议架构:四层子协议协同机制

TLS(Transport Layer Security)协议并非单一算法,而是一套由四层子协议构成的层次化安全通信框架。每一层子协议承担特定职责,通过严格的消息交换顺序与状态机,共同实现机密性、完整性、身份认证与防重放攻击。理解这四层协议是掌握 TLS 安全通信的基石。

3.1 协议层次总览

TLS 协议位于传输层(如 TCP)与应用层(如 HTTP)之间,其内部划分为四个子协议:

子协议名称 协议类型值 主要职责 工作阶段
TLS 记录协议 — 分片、压缩、加密、MAC、传输 全程(握手与数据传输)
TLS 握手协议 22 (0x16) 协商密码套件、身份认证、密钥交换 连接建立阶段
TLS 变更密码规范协议 20 (0x14) 通知对端切换至新协商的安全参数 握手阶段末尾
TLS 警报协议 21 (0x15) 传递错误与连接关闭信号 全程(异常时触发)
协议类型值:TLS 记录层使用 5 位 ContentType 字段标识上层协议。抓包分析时,通过该值可快速判断当前数据包属于哪个子协议。

3.2 TLS 记录协议(Record Protocol)

TLS 记录协议是最底层的子协议,所有上层协议(握手、警报、变更密码规范、应用数据)都必须封装在记录协议的数据单元中传输。它提供以下核心功能:

  • 分片:将上层消息切分为 ≤ 2¹⁴ 字节(16 KB)的记录块。
  • 压缩(可选):在 TLS 1.3 中已废弃,TLS 1.2 及之前版本可使用。
  • 加密与 MAC:使用握手阶段协商的对称密钥与算法,对记录负载进行加密并附加消息认证码。
  • 序列号保护:每个方向维护 64 位序列号,防止重放与乱序。

记录协议的数据包格式如下:

struct {
    ContentType type;          // 1 字节,上层协议类型
    ProtocolVersion version;   // 2 字节,TLS 版本号
    uint16 length;             // 2 字节,负载长度
    opaque fragment[TLSPlaintext.length]; // 负载数据
} TLSPlaintext;
安全要点:记录协议是 TLS 安全性的最后一道防线。即使握手协议被攻破,只要记录协议的加密与 MAC 实现正确,攻击者仍无法读取或篡改应用数据。

3.3 TLS 握手协议(Handshake Protocol)

握手协议是 TLS 中最复杂、最核心的子协议,负责在客户端与服务器之间建立共享安全参数。其典型流程(TLS 1.2 完整握手)包含以下步骤:

  1. ClientHello:客户端发送支持的 TLS 版本、密码套件列表、随机数。
  2. ServerHello:服务器选定版本与密码套件,返回随机数。
  3. Certificate:服务器发送数字证书(含公钥)。
  4. ServerKeyExchange(可选):传递 Diffie-Hellman 参数或 ECDHE 临时公钥。
  5. CertificateRequest(可选):要求客户端提供证书。
  6. ServerHelloDone:服务器握手消息结束。
  7. Certificate(客户端,可选):客户端发送证书。
  8. ClientKeyExchange:客户端发送预主密钥(RSA 加密)或 DH 公钥。
  9. CertificateVerify(可选):客户端证明持有证书私钥。
  10. ChangeCipherSpec:客户端通知切换加密。
  11. Finished:客户端发送握手消息的 MAC 验证。
  12. ChangeCipherSpec:服务器通知切换加密。
  13. Finished:服务器发送握手消息的 MAC 验证。
性能陷阱:完整握手需要 2-RTT(往返时延)。TLS 1.3 通过 1-RTT 握手和 0-RTT 会话恢复大幅降低延迟,但需注意 0-RTT 存在重放攻击风险。

3.4 TLS 变更密码规范协议(Change Cipher Spec Protocol)

该协议是 TLS 中最简单的子协议,仅包含一个单字节消息,值为 0x01。其作用是在握手过程中,通知对端:后续所有记录将使用新协商的密码参数进行加密与 MAC 保护。

  • 发送时机:在 Finished 消息之前发送。
  • 安全意义:确保双方在切换加密前已完成所有握手消息的明文验证。
  • TLS 1.3 变化:该协议被合并到握手协议中,不再作为独立子协议存在。

3.5 TLS 警报协议(Alert Protocol)

警报协议用于在 TLS 连接中传递错误状态或连接关闭信号。警报消息包含两个字段:

struct {
    AlertLevel level;          // 1 字节:1=warning, 2=fatal
    AlertDescription description; // 1 字节:具体错误码
} Alert;

常见警报描述码:

描述码 值 含义 严重级别
close_notify 0 正常关闭连接 warning
unexpected_message 10 收到意外类型的消息 fatal
bad_record_mac 20 MAC 验证失败 fatal
handshake_failure 40 握手协商失败 fatal
certificate_expired 45 证书已过期 warning/fatal
decrypt_error 51 解密操作失败 fatal
安全最佳实践:收到 fatal 级别警报后,接收方必须立即关闭连接,不得继续传输任何数据。这是防止降级攻击与协议混淆的关键机制。

3.6 四层协议协同工作流程

下图展示了 TLS 连接建立过程中,四个子协议如何按时间顺序协同工作:

TLS 四层子协议协同工作流程 客户端 ClientHello ClientKeyExchange ChangeCipherSpec Finished 应用数据(加密) 服务器 ServerHello + Cert ServerHelloDone ChangeCipherSpec Finished 应用数据(加密) 子协议分层对应关系 ClientHello / ServerHello → 握手协议(类型 22) ChangeCipherSpec → 变更密码规范协议(类型 20) 应用数据 → 记录协议直接封装(类型 23)

3.7 协议间依赖关系与安全边界

四个子协议之间存在严格的依赖与约束关系:

  • 记录协议是承载层:所有其他子协议的消息都必须通过记录协议进行分片、加密与传输。
  • 握手协议驱动状态机:握手协议协商出的密钥材料直接决定记录协议的加密参数。
  • 变更密码规范协议是同步信号:它确保双方在同一时刻切换加密状态,避免“半加密”状态导致数据泄露。
  • 警报协议是异常处理通道:当握手协议或记录协议检测到错误时,通过警报协议通知对端并终止连接。
常见攻击面:历史上曾出现针对记录协议的 BEAST 攻击(利用 CBC 模式 IV 预测)和针对握手协议的 POODLE 攻击(利用填充预言)。这些攻击均利用了子协议间的交互边界漏洞。现代 TLS 实现通过禁用弱密码套件、使用 AEAD 模式(如 AES-GCM)来防御。

3.8 子协议在 TLS 1.3 中的演进

TLS 1.3 对协议架构进行了重大简化:

子协议 TLS 1.2 及之前 TLS 1.3
记录协议 支持压缩、CBC 模式 仅支持 AEAD,压缩已移除
握手协议 完整握手 2-RTT 1-RTT 握手,0-RTT 会话恢复
变更密码规范协议 独立子协议 已废弃,不再作为独立协议
警报协议 warning 与 fatal 级别 仅保留 fatal 级别,简化错误码
实战建议:新系统开发应优先使用 TLS 1.3。若需兼容旧系统,务必禁用 TLS 1.0/1.1 及弱密码套件(如 RC4、CBC 模式、3DES),并启用 HSTS 与 证书透明度 增强安全性。