TLS 记录协议(Record Protocol)是 TLS 协议栈的最底层,负责对数据进行分片、压缩、计算 MAC、加密和传输。理解它的工作原理有助于深入掌握 TLS 安全机制。

记录协议的核心功能

记录协议接收上层数据后,依次经过以下处理流程:

  1. 分片:将数据切分为固定大小的记录块
  2. 压缩:对数据进行压缩(TLS 1.3 已废弃)
  3. MAC 计算:添加消息认证码
  4. 加密:对数据加密
  5. 传输:发送加密后的数据

分片机制

每个 TLS 记录包含一个 5 字节的头部和可变长度的载荷:

1
2
3
4
5
+-----------+------------+----------------+
|  类型(1)  | 版本(2)   |  长度(2)       |  <- 头部 (5 字节)
+-----------+------------+----------------+
|              加密数据...                |  <- 载荷
+-----------+---------------------------+
  • 类型:Content Type,1 字节,标识记录类型
    • 0x14 = ChangeCipherSpec
    • 0x15 = Alert
    • 0x16 = Handshake
    • 0x17 = Application Data
  • 版本:Protocol Version,2 字节(TLS 1.2 为 0x0303,TLS 1.3 为 0x0303)
  • 长度:Payload Length,2 字节,最大 16384 字节

用 Wireshark 观察 TLS 1.2 握手:

1
2
3
4
5
6
7
8
9
Handshake Protocol: Client Hello
    Content Type: Handshake (22)
    Version: TLS 1.2 (0x0303)
    Length: 512

Application Data
    Content Type: Application Data (23)
    Version: TLS 1.2 (0x0303)
    Length: 32

MAC 与加密

TLS 1.2 使用 MAC-then-Encrypt 模式,TLS 1.3 改为 Authenticated Encryption (AEAD)。

TLS 1.2:MAC-then-Encrypt

1
明文 → MAC 追加 → 填充 → 加密 → 传输

典型结构:

1
MAC(Key, seq_num || type || version || length || data)

TLS 1.3:AEAD 加密

TLS 1.3 强制使用 AEAD(认证加密)算法,如 AES-GCM、ChaCha20-Poly1305:

1
2
3
4
5
6
7
# TLS 1.3 使用的密码套件
$ echo | openssl s_client -connect openssl.org:443 -tls1_3 2>&1 | grep Cipher
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384

# TLS 1.2 的密码套件
$ echo | openssl s_client -connect openssl.org:443 -tls1_2 2>&1 | grep Cipher  
New, TLSv1.2, Cipher is ECDHE-RSA-CHACHA20-POLY1305

AEAD 模式同时提供机密性和完整性验证,安全性更高。

记录类型详解

Application Data(0x17)

应用数据记录,加密传输:

1
2
# 查看加密后的应用数据(十六进制)
$ echo "GET / HTTP/1.0\r\n\r\n" | openssl s_client -connect openssl.org:443 -tls1_3 2>&1 | xxd | head -20

Handshake(0x16)

握手记录,TLS 1.2 使用 MAC-then-Encrypt,TLS 1.3 使用 AEAD:

1
2
3
4
5
6
7
# TLS 1.3 握手记录类型
$ echo | openssl s_client -connect openssl.org:443 -tls1_3 -msg 2>&1 | grep ">>>" | head -10
>>> TLS 1.3, ClientHello
>>> TLS 1.3, ServerHello
>>> TLS 1.3, Encrypted Extensions
>>> TLS 1.3, Certificate
>>> TLS 1.3, Certificate Verify

Alert(0x15)

警告消息,如 TLS 1.2 的证书链验证失败:

1
21  50  <- Fatal (21), BadCertificate (50)

常见警告码:

  • 10 = Unexpected Message
  • 20 = Bad Record MAC
  • 21 = Decryption Failed
  • 22 = Record Overflow
  • 51 = Decrypt Error

ChangeCipherSpec(0x14)

TLS 1.2 切换加密算法的信号,TLS 1.3 已废除此类型。

TLS 1.3 的变化

TLS 1.3 对记录协议做了重大简化:

特性 TLS 1.2 TLS 1.3
压缩 支持 禁用(安全原因)
MAC HMAC AEAD
加密时机 ChangeCipherSpec 后 Handshake 时同步加密
记录类型 4 种 2 种(Handshake + Application)

TLS 1.3 在握手阶段就使用加密,握手消息也被保护:

1
2
3
4
5
# TLS 1.3 握手消息是加密的
$ echo | openssl s_client -connect openssl.org:443 -tls1_3 -msg 2>&1 | head -5
read R BLOCK
>>> [no label] TLS 1.3, ClientHello
<<< [no label] TLS 1.3, ServerHello

注意 [no label] 表示消息已被加密。

实际观察

用 Wireshark 观察 TLS 记录结构:

  1. 过滤器:tls.record.content_type
  2. TLS 1.3 的 Application Data 记录:
    • Content Type = 23 (Application Data)
    • Encrypted Data 包含加密的应用层数据
1
2
3
# 抓取 TLS 流量(仅演示)
$ tcpdump -i any -w tls.pcap 'tcp port 443'
# 然后用 Wireshark 分析

安全影响

记录协议的安全机制直接影响 TLS 的安全性:

  1. 记录溢出:单个记录最大 16384 字节,攻击者可能尝试构造恶意记录
  2. MAC 绕过:TLS 1.2 的 MAC-then-Encrypt 曾被发现弱点
  3. 填充 Oracle:CBC 模式填充验证时机不当导致攻击(如 Lucky Thirteen)

TLS 1.3 通过强制 AEAD 消除了这类攻击面。

总结

TLS 记录协议是 TLS 安全的基石:

  • 负责数据的分片、认证和加密
  • TLS 1.3 通过 AEAD 简化了安全模型
  • 记录头包含类型、版本和长度信息
  • 理解记录协议有助于诊断 TLS 问题

参考来源