Appendix E. Backward Compatibility (向后兼容性)
本附录讨论 TLS 1.2 与早期版本之间的兼容性问题.
E.1. Compatibility with TLS 1.0/1.1 and SSL 3.0
由于新功能和若干结构性变化, TLS 1.2 与 TLS 1.1, TLS 1.0 和 SSL 3.0 之间不存在直接互操作. 但是, TLS 1.2 包含一种机制, 使 TLS 1.2 实现可以与早期版本协商.
E.1.1. Version Negotiation (版本协商)
TLS 在 handshake 中提供内建 version negotiation 机制:
- ClientHello 中的 version: client 在 ClientHello 中指示其支持的最高版本. 实现应该在 ClientHello 中指示 TLS 1.2 (version {3, 3}).
- ServerHello 中的 version: server 选择自身和 client 都支持的最高版本. 如果 server 不支持 client 建议的版本, 则选择较低版本.
- Record Layer Version: 为获得最大兼容性, ClientHello record 的 version 应该设置为 {3, 1} (TLS 1.0). 后续 record 使用协商出的版本.
E.1.2. Extensions (扩展)
TLS 1.2 引入新的 extension 并变更一些现有 extension. TLS 1.2 client 必须包含 signature_algorithms extension. 早期版本的 server 会忽略其不理解的 extension.
E.1.3. Cipher Suites (密码套件)
某些 cipher suite 特定于 TLS 1.2, 例如使用 SHA-256 PRF 的 cipher suite 和新的 AEAD cipher suite. 与早期版本协商时, 这些 cipher suite 不应该在 ClientHello 中提供.
E.1.4. Implementation Recommendations (实现建议)
client 实现应该支持多个 TLS version, 在 ClientHello 中宣告最高支持版本, 准备接受较低版本, 并实现 version fallback protection (SCSV).
server 实现应该为广泛兼容性支持多个 TLS version, 优先选择最高 protocol version, 并正确处理来自早期版本的 ClientHello.
E.2. Compatibility with SSL 2.0
新实现不应该使用 SSL 2.0. 但是, 为兼容遗留系统, 某些实现可能需要理解 SSL 2.0 格式的 ClientHello.
TLS 1.2 server 可以接受封装为 SSL 2.0 格式的 ClientHello, 但必须检查 msg_length 最高 bit, 验证格式有效性, 将其转换为 TLS 格式处理, 并以 TLS 格式 ServerHello 响应.
支持 SSL 2.0 格式 ClientHello 并不表示支持 SSL 2.0 protocol 本身. SSL 2.0 有许多已知安全漏洞, 不得协商使用.
TLS 1.2 client 不得发送 SSL 2.0 格式 ClientHello. server 支持 SSL 2.0 格式 ClientHello 现在是可以而不是应该. 发送 SSL 2.0 格式 ClientHello 是不应该.
E.3. Avoiding Man-in-the-Middle Version Rollback (避免中间人版本回滚)
早期协议版本容易受到 version rollback attack, 攻击者可能强制 connection 使用较早且较弱的 protocol version.
TLS 1.2 使用多个机制防止 version rollback:
- ClientHello 和 ServerHello 中的 version: 显式指示协商版本, Finished message 包含这些值的 hash.
- Finished Message: 包含所有 handshake message 的 MAC, 任何修改都会导致验证失败.
- TLS_FALLBACK_SCSV: RFC 7507 定义的 Signaling Cipher Suite Value. client 在用较低版本重试 connection 时包含该值, server 如果支持更高版本则拒绝该 connection.
client 必须记录此前尝试过的版本, 在降级重试时包含 TLS_FALLBACK_SCSV, 并验证 Finished message. server 必须检查 TLS_FALLBACK_SCSV, 如果支持更高版本则发送 inappropriate_fallback alert, 并正确计算和验证 Finished message.