协商较旧版本的 TLS 1.3 服务器,降到 TLS 1.2 时必须把 ServerHello.random 的最后 8 个字节设为 44 4F 57 4E 47 52 44 01(ASCII DOWNGRD 加上 0x01),降到 TLS 1.1 及以下版本时则设为 …00;收到该值的 TLS 1.3 客户端必须中止握手(RFC 9846 §4.2.3)。由于服务器随机数受服务器签名保护,攻击者无法将其删除。
更早的防御手段有:TLS_FALLBACK_SCSV 信令值(RFC 7507),用于应对浏览器以更低版本重试(POODLE 时代);以及 Finished 中的握手消息记录哈希,它能发现对协商参数的篡改。在 TLS 1.2 中,降级到出口级密钥交换或 RSA 密钥交换(FREAK、Logjam)之所以得逞,是因为服务器仍支持这些弱选项;禁用它们才是真正的修复。
同样的思路也适用于其他场合:HSTS 和 MTA-STS 防止从 HTTPS 或 STARTTLS 降级为明文;混合密钥交换也不得让对端剥离其中的后量子部分,因此它作为单个组来协商。