2. 符号约定 (Notational Conventions)
本文档中的关键词 "MUST"、"MUST NOT"、"REQUIRED"、"SHALL"、"SHALL NOT"、"SHOULD"、"SHOULD NOT"、"RECOMMENDED"、"NOT RECOMMENDED"、"MAY" 和 "OPTIONAL",仅当它们以全大写形式出现时(如此处所示),应按照 BCP 14 [RFC2119] [RFC8174] 中的描述进行解释.
本文档使用 [QUIC-TRANSPORT] 中建立的术语.
为简洁起见,缩写 TLS 用于指代 TLS 1.3,尽管也可以使用更新的版本; 参见第 4.2 节.
2.1. TLS 概述 (TLS Overview)
TLS 为两个端点提供了一种通过不可信介质(例如互联网)建立通信手段的方法. TLS 能够对对等方进行身份验证 (Authentication),并为端点之间交换的消息提供机密性 (Confidentiality) 和完整性 (Integrity) 保护.
在内部,TLS 是一个分层协议 (Layered Protocol),其结构如图 1 所示.
+-------------+------------+--------------+---------+
Content | | | Application | |
Layer | Handshake | Alerts | Data | ... |
| | | | |
+-------------+------------+--------------+---------+
Record | |
Layer | Records |
| |
+---------------------------------------------------+
图 1: TLS 层次结构
每个内容层消息(例如握手、警报和应用数据)由记录层作为一系列类型化的 TLS 记录 (Records) 承载. 记录被单独进行加密保护,然后通过可靠传输(通常是 TCP)进行传输,该传输提供排序和保证交付.
TLS 认证密钥交换 (Authenticated Key Exchange) 发生在两个端点之间: 客户端 (Client) 和服务器 (Server). 客户端发起交换,服务器响应. 如果密钥交换成功完成,客户端和服务器都将就一个密钥 (Secret) 达成一致. TLS 支持预共享密钥 (Pre-Shared Key, PSK) 和基于有限域或椭圆曲线的 Diffie-Hellman ((EC)DHE) 密钥交换. PSK 是早期数据 (Early Data, 0-RTT) 的基础; 后者在 (EC)DHE 密钥被销毁时提供前向保密性 (Forward Secrecy, FS). 这两种模式也可以结合使用,在使用 PSK 进行身份验证的同时提供前向保密性.
完成 TLS 握手后,客户端将学习并验证服务器的身份,服务器也可以选择学习并验证客户端的身份. TLS 支持基于 X.509 [RFC5280] 证书 (Certificate) 的服务器和客户端身份验证. 当使用 PSK 密钥交换时(如恢复会话中),对 PSK 的了解即可用于验证对等方.
TLS 密钥交换能够抵御攻击者的篡改,并且它生成的共享密钥不能被任何一方参与者控制.
TLS 提供了两种 QUIC 关注的基本握手模式:
-
完整 1-RTT 握手 (Full 1-RTT Handshake): 客户端能够在一个往返时间后发送应用数据,服务器在收到客户端的第一个握手消息后立即响应.
-
0-RTT 握手 (0-RTT Handshake): 客户端使用其先前了解到的关于服务器的信息立即发送应用数据. 此应用数据可能被攻击者重放,因此 0-RTT 不适合承载可能在重放时引发不希望效果的指令.
图 2 显示了带有 0-RTT 应用数据的简化 TLS 握手.
客户端 服务器
ClientHello
(0-RTT Application Data) -------->
ServerHello
{EncryptedExtensions}
{Finished}
<-------- [Application Data]
{Finished} -------->
[Application Data] <-------> [Application Data]
() 表示由早期数据 (0-RTT) 密钥保护的消息
{} 表示使用握手密钥保护的消息
[] 表示使用应用数据 (1-RTT) 密钥保护的消息
图 2: 带有 0-RTT 的 TLS 握手
图 2 省略了 EndOfEarlyData 消息,该消息在 QUIC 中不使用; 参见第 8.3 节. 同样,QUIC 也不使用 ChangeCipherSpec 和 KeyUpdate 消息. ChangeCipherSpec 在 TLS 1.3 中是冗余的; 参见第 8.4 节. QUIC 有自己的密钥更新机制; 参见第 6 节.
数据使用多个加密级别 (Encryption Levels) 进行保护:
- 初始密钥 (Initial Keys)
- 早期数据 (0-RTT) 密钥 (Early Data Keys)
- 握手密钥 (Handshake Keys)
- 应用数据 (1-RTT) 密钥 (Application Data Keys)
应用数据只能出现在早期数据和应用数据级别. 握手和警报消息可以出现在任何级别.
如果客户端和服务器之前已经通信过,则可以使用 0-RTT 握手. 在 1-RTT 握手中,客户端在收到服务器发送的所有握手消息之前,无法发送受保护的应用数据.