9. 合规要求 (Compliance Requirements)
9.1. 强制实现的密码套件 (Mandatory-to-Implement Cipher Suites)
在没有应用配置文件标准另行规定的情况下:
符合TLS标准的应用程序必须 (MUST) 实现 TLS_AES_128_GCM_SHA256 [GCM] 密码套件,并且应当 (SHOULD) 实现 TLS_AES_256_GCM_SHA384 [GCM] 和 TLS_CHACHA20_POLY1305_SHA256 [RFC8439] 密码套件(见附录B.4)。
符合TLS标准的应用程序必须 (MUST) 支持使用 rsa_pkcs1_sha256(用于证书)、rsa_pss_rsae_sha256(用于CertificateVerify和证书)和 ecdsa_secp256r1_sha256 的数字签名。符合TLS标准的应用程序必须 (MUST) 支持使用 secp256r1(NIST P-256)的密钥交换,并且应当 (SHOULD) 支持使用 X25519 [RFC7748] 的密钥交换。
9.2. 强制实现的扩展 (Mandatory-to-Implement Extensions)
在没有应用配置文件标准另行规定的情况下,符合TLS标准的应用程序必须 (MUST) 实现以下TLS扩展:
- 支持版本 ("supported_versions"; 第4.2.1节)
- Cookie ("cookie"; 第4.2.2节)
- 签名算法 ("signature_algorithms"; 第4.2.3节)
- 签名算法证书 ("signature_algorithms_cert"; 第4.2.3节)
- 协商组 ("supported_groups"; 第4.2.7节)
- 密钥共享 ("key_share"; 第4.2.8节)
- 服务器名称指示 ("server_name"; [RFC6066]第3节)
所有实现在提供适用功能时必须 (MUST) 发送并使用这些扩展:
-
supported_versions对于所有ClientHello、ServerHello和HelloRetryRequest消息是必需的 (REQUIRED)。 -
signature_algorithms对于证书认证是必需的 (REQUIRED)。 -
supported_groups对于使用DHE或ECDHE密钥交换的ClientHello消息是必需的 (REQUIRED)。 -
key_share对于DHE或ECDHE密钥交换是必需的 (REQUIRED)。 -
pre_shared_key对于PSK密钥协商是必需的 (REQUIRED)。 -
psk_key_exchange_modes对于PSK密钥协商是必需的 (REQUIRED)。
如果ClientHello包含一个 supported_versions 扩展,且其主体中包含0x0304,则认为客户端正在尝试使用本规范进行协商。这样的ClientHello消息必须 (MUST) 满足以下要求:
-
如果不包含
pre_shared_key扩展,它必须 (MUST) 同时包含signature_algorithms扩展和supported_groups扩展。 -
如果包含
supported_groups扩展,它也必须 (MUST) 包含key_share扩展,反之亦然。允许空的KeyShare.client_shares向量。
接收到不符合这些要求的ClientHello的服务器必须 (MUST) 以 missing_extension 警报中止握手。
此外,所有实现必须 (MUST) 支持在能够使用它的应用程序中使用 server_name 扩展。服务器可以 (MAY) 要求客户端发送有效的 server_name 扩展。要求此扩展的服务器应当 (SHOULD) 通过以 missing_extension 警报终止连接来响应缺少 server_name 扩展的ClientHello。
9.3. 协议不变量 (Protocol Invariants)
本节描述了TLS端点和中间盒必须 (MUST) 遵循的不变量,以确保协议的互操作性。
TLS被设计为可在各种网络环境中使用,包括在不理解TLS协议的中间盒(如防火墙、代理和网络地址转换器)存在的情况下。这些中间盒可能检查TLS连接的某些方面,并可能基于其观察结果采取行动。为了最大化互操作性,TLS 1.3实现必须 (MUST) 遵守某些协议不变量,以确保中间盒不会误解连接。
以下是TLS 1.3中的关键协议不变量:
记录层不变量 (Record Layer Invariants)
TLS记录层必须 (MUST) 遵守以下不变量:
-
记录版本 (Record Version): 所有记录(除了初始ClientHello)必须 (MUST) 将
legacy_record_version设置为0x0303(TLS 1.2)。初始ClientHello可以 (MAY) 将此字段设置为0x0301(TLS 1.0)以实现最大兼容性。 -
内容类型 (Content Type): 所有加密记录必须 (MUST) 将外部内容类型设置为application_data(23)。实际内容类型在TLSInnerPlaintext中。
-
记录大小 (Record Size): 未加密的TLSPlaintext记录不得 (MUST NOT) 超过2^14字节。加密的TLSCiphertext记录不得 (MUST NOT) 超过2^14 + 256字节。
握手不变量 (Handshake Invariants)
TLS握手必须 (MUST) 遵守以下不变量:
-
扩展排序 (Extension Ordering):
pre_shared_key扩展必须 (MUST) 是ClientHello中的最后一个扩展。 -
消息排序 (Message Ordering): 握手消息必须 (MUST) 按照第4节中指定的顺序发送。
-
密钥更改边界 (Key Change Boundaries): 某些消息(ClientHello、EndOfEarlyData、ServerHello、Finished、KeyUpdate)必须 (MUST) 与记录边界对齐。
中间盒兼容性 (Middlebox Compatibility)
为了与传统中间盒兼容,TLS 1.3实现:
-
必须 (MUST) 在ServerHello之后发送一个change_cipher_spec记录(作为单独的记录)以实现中间盒兼容性。
-
可以 (MAY) 忽略在握手期间接收到的意外change_cipher_spec记录(值0x01)。
-
必须 (MUST) 在ServerHello中使用0x0303作为legacy_version。
这些不变量确保TLS 1.3流量对于不理解新协议版本的中间盒来说看起来足够像TLS 1.2,从而最大化部署成功率。