TLS 1.3 Key Schedule
TLS 1.3 通过 (EC)DHE/PSK 输入 HKDF key schedule,逐层派生 handshake traffic secrets、application traffic secrets、finished/resumption 等用途隔离密钥,再交给 AEAD 保护记录;证书签名负责认证,不直接生成会话加密密钥。
[!info] related notes
TLS 1.3 Key Schedule
一句话关系
TLS 1.3 的核心不是“客户端生成一个 session key 再用服务器公钥加密”。
现代主线是:
(EC)DHE / PSK input
→ HKDF key schedule
→ handshake traffic secrets
→ application traffic secrets
→ AEAD keys / IVs
证书与数字签名负责认证服务器身份;它们和 traffic key derivation 是不同职责。
两类输入 Secret
RFC 8446 的 key schedule 主要可以吸收两类 secret:
- PSK;
- (EC)DHE shared secret。
典型完整新连接通常使用 ephemeral (EC)DHE。
PSK 可以来自:
- 外部预共享密钥;
- 之前连接的 resumption secret。
HKDF
TLS 1.3 使用 HKDF 的:
- HKDF-Extract;
- HKDF-Expand / HKDF-Expand-Label;
逐步派生不同用途 secret。
核心价值:
从输入 keying material 派生彼此用途隔离、和握手 transcript 绑定的多个 secret。
简化层级
可以先用这张简化图:
PSK
→ Early Secret
(EC)DHE shared secret
→ Handshake Secret
handshake transcript
→ client/server handshake traffic secret
继续派生
→ Master Secret
application transcript
→ client/server application traffic secret
后续还可派生:
- exporter master secret;
- resumption master secret;
- finished key;
- traffic key / IV。
真实 RFC 图更细,但这条主线足够建立心智模型。
Certificate 的角色
Server Certificate 提供:
- public key;
- identity binding;
- certificate chain。
CertificateVerify 用 server private key 对 handshake transcript 做签名。
所以:
certificate private key
→ authenticate server / transcript
而不是:
certificate public key
→ encrypt session key
TLS 1.3 已不再使用旧式 static RSA key transport。
Finished
Finished message 使用由 key schedule 派生的 finished key 对握手 transcript 做认证。
它证明:
- 双方拥有一致的握手 secrets;
- transcript 没被中间人悄悄修改。
因此 certificate authentication 与 Finished transcript authentication 也是不同层。
Application Traffic Secret
握手完成后,双方拥有方向分离的 traffic secret:
- client application traffic secret;
- server application traffic secret。
再从各自 secret 派生:
- AEAD key;
- IV。
因此:
client→server key
≠ server→client key
这种方向隔离降低 key reuse 风险。
AEAD
TLS 1.3 cipher suite 只选择 AEAD + hash 组合。
例如:
- AES-GCM;
- ChaCha20-Poly1305;
用于 record protection。
cipher suite 不再像 TLS 1.2 那样同时编码 certificate/key-exchange algorithm 的巨大组合。
Forward Secrecy
使用 ephemeral (EC)DHE 时:
- 每次连接生成临时 key agreement material;
- session traffic secret 不只取决于长期 certificate private key。
因此未来长期 signing key 泄漏,不会自动恢复过去已记录 session 的 traffic keys。
PSK / Resumption
TLS 1.3 resumption 使用上一连接派生出的 resumption secret 建立 PSK。
这可以:
- 减少握手成本;
- 支持 0-RTT early data。
但 0-RTT 存在 replay 风险,所以有副作用业务请求必须特别谨慎。
Key Update
长连接中可以通过 KeyUpdate 机制演进 application traffic keys。
这避免一个 traffic key 永久保护无限量数据。
与 Password KDF 不同
TLS 的 HKDF 目标不是故意“算得很慢”。
HKDF 处理的是高质量 keying material,用于:
- extract;
- expand;
- domain separation;
- key hierarchy。
它和 Argon2/PBKDF2 这种针对低熵 password 的 password-based KDF 是不同问题。
学习检查
- TLS 1.3 为什么不能再用“公钥加密 premaster secret”作为主心智模型?
- certificate private key 与 (EC)DHE ephemeral key 分别做什么?
- HKDF-Extract / Expand 在 key schedule 中解决什么问题?
- 为什么 client 和 server application traffic keys 要分开?
- Finished message 认证的是哪一层内容?
- TLS 1.3 cipher suite 为什么比 TLS 1.2 简化?
- ECDHE 怎样提供 Forward Secrecy?
- resumption PSK 与 0-RTT 为什么会引入 replay 边界?