8. TLS握手的QUIC特定调整 (QUIC-Specific Adjustments to the TLS Handshake)
当与QUIC一起使用时,TLS握手的某些方面有所不同。
QUIC还要求加密握手提供对安全性和性能都至关重要的参数的认证协商。除了加密参数的协商之外,TLS握手还传输和验证QUIC传输参数的值。
8.1. 协议协商 (Protocol Negotiation)
QUIC要求加密握手提供协议协商的认证。TLS使用应用层协议协商(ALPN)[ALPN]来选择应用协议。除非使用另一种机制来商定应用协议,否则终端必须(MUST)为此目的使用ALPN。
使用ALPN时,如果未协商应用协议,终端必须(MUST)立即关闭连接(参见[QUIC-TRANSPORT]第10.2节),使用no_application_protocol TLS警报(QUIC错误代码0x0178;参见第4.8节)。[ALPN]规定只有服务器使用此警报,但QUIC客户端必须(MUST)在ALPN协商失败时使用错误0x0178终止连接。
应用协议可以(MAY)限制可以使用的QUIC版本。服务器必须(MUST)选择与客户端选择的QUIC版本兼容的应用协议。服务器必须(MUST)将无法选择兼容应用协议视为类型为0x0178(no_application_protocol)的连接错误。同样,客户端必须(MUST)将服务器选择不兼容的应用协议视为类型为0x0178的连接错误。
8.2. QUIC传输参数扩展 (QUIC Transport Parameters Extension)
QUIC传输参数在TLS扩展中传输。不同版本的QUIC可能定义不同的方法来协商传输配置。
将传输参数包含在TLS握手中为这些值提供完整性保护。
enum {
quic_transport_parameters(0x39), (65535)
} ExtensionType;
quic_transport_parameters扩展的extension_data字段包含由正在使用的QUIC版本定义的值。
quic_transport_parameters扩展在握手期间的ClientHello和EncryptedExtensions消息中传输。终端必须(MUST)发送quic_transport_parameters扩展。接收到没有quic_transport_parameters扩展的ClientHello或EncryptedExtensions的终端必须(MUST)以类型为0x016d的错误关闭连接(等效于TLS致命警报missing_extension;参见第4.8节)。
传输参数在握手完成之前变得可用。服务器可以在握手完成之前使用这些值。但是,在握手完成之前,传输参数值未经认证,因此这些参数的任何使用都不能依赖于它们的真实性。传输参数的篡改将导致握手失败。
终端不得(MUST NOT)在不使用QUIC的TLS连接中发送此扩展(例如[TLS13]中定义的在TCP上使用TLS)。支持此扩展的实现必须(MUST)在传输不是QUIC时接收此扩展时发送unsupported_extension致命警报。
quic_transport_parameters扩展的协商移除了EndOfEarlyData(参见第8.3节)。
8.3. 移除EndOfEarlyData消息 (Removing the EndOfEarlyData Message)
QUIC不使用TLS EndOfEarlyData消息。QUIC不依赖此消息来标记0-RTT数据的结束或信号切换到握手密钥。
客户端不得(MUST NOT)发送EndOfEarlyData消息。服务器必须(MUST)将在0-RTT数据包中接收CRYPTO帧视为类型为PROTOCOL_VIOLATION的连接错误。
因此,EndOfEarlyData不会出现在TLS握手记录中。
8.4. 禁止TLS中间盒兼容模式 (Prohibiting TLS Middlebox Compatibility Mode)
[TLS13]的附录D.4描述了对TLS 1.3握手的更改,作为某些中间盒中错误的解决方法。TLS 1.3中间盒兼容模式涉及将ClientHello和ServerHello中的legacy_session_id字段设置为32字节的值,并发送change_cipher_spec记录。该字段和记录都不携带语义内容并被忽略。
此模式在QUIC中没有用,因为它仅适用于干扰TCP上TLS的中间盒。QUIC甚至不提供传输change_cipher_spec记录的方法。客户端不得(MUST NOT)请求使用TLS 1.3兼容模式。服务器应该(SHOULD)将接收到具有非空legacy_session_id字段的TLS ClientHello视为类型为PROTOCOL_VIOLATION的连接错误。