摘要

  • 在完整 TLS 握手中,False Start 允许客户端发出自己的 Finished 后,趁服务器 Finished 仍在返回途中,使用新协商密钥先发送应用数据。
  • 普通握手并未被省略;提前放行必须依赖应用主动选择、严格密码白名单、已确定的应用协议以及“数据已发但握手失败”的处理规则。

应用记录超过了最后一份证明

按照 RFC 5246 的通常顺序,客户端处理服务器证书与密钥交换,发出 ChangeCipherSpec 和 Finished,然后等待服务器对应的 ChangeCipherSpec 与 Finished。只有验证对方 Finished 后,握手才完成,应用数据才出发。

False Start 把第一条应用记录移进这段等待。客户端已算出新密钥,也已发出自己的握手证明。加密记录向服务器前进,服务器的最终证明同时向客户端返回。

RFC 7918 把成功情形称为“追溯验证”:服务器 Finished 到达并通过后,最终仍是一场普通、有效的握手,变化只在时序。它没有删除网络往返,而是在结果回来之前使用了这段时间。

已经知道很多,仍缺最后确认

提前发送时,客户端已经看到 ServerHello、密码套件、服务器证书与密钥交换参数。应用记录由新 Cipher Spec 保护。因此 False Start 不是明文,也不是与 ClientHello 一起盲发数据。

尚缺的是服务器 Finished。它证明对端拥有同一秘密,并对同一握手记录达成一致。如果 Finished 缺失或验证失败,握手从未成立。普通时序不会放出应用数据,False Start 却已经放出。

所以问题不是“有没有加密”,而是“当最后一项身份确认尚未完成时,哪些数据允许离开”。

客户端选择提前,服务器只需容忍

False Start 没有新增一项由服务器授权的扩展。RFC 7918 定义的是客户端可选行为。所谓兼容服务器,是能够容忍受保护记录早于常规状态机处理点到达的服务器。

兼容性可以来自应用规范或外部知识,不能从沉默推导。中间盒或服务器的重置与停顿说明它们对消息顺序有不同假设,并不说明新密钥本身失效。

应用层必须主动请求 False Start。通用 TLS 库不知道第一条消息是无副作用读取、凭证还是不可逆命令;知道数据意义的一层必须参与是否抢跑的决定。

白名单给捷径加上围栏

RFC 7918 要求限制协议版本、对称密码、密钥交换、参数以及可能使用的客户端证书类型。建议的 DHE/ECDHE 交换提供前向保密;不能确认安全的组合就不得抢跑。

这些限制防止降级把已出发的数据置于较弱配置下。但白名单本身成为生命周期系统:库升级、回退策略或默认套件变化,都可能改变哪些连接会提前说话。应用没有审核过的扩大不能悄悄上线。

“TLS 最终成功”不足以证明决策正确;还要证明当时的精确版本与密码组合获准跨过未完成证明边界。

先确定语言,再提前发言

RFC 7301 把 ALPN 放在 hello 交换中:客户端在 ClientHello 提议应用协议,服务器在 ServerHello 选择。False Start 决策之前,客户端便能知道服务器将用哪种应用语法解释第一条记录。

ALPN 不会自动授权抢跑。它只是避免客户端在不知道解析语法时发送数据。应用 opt-in、ALPN 结果和密码白名单必须共同指向同一配置。

强加密不能让“交给错误协议的字节”变安全。性能优化也需要先关闭协议选择边界。

失败能终止以后,不能收回以前

服务器 Finished 验证成功,握手继续;缺失或错误,客户端必须失败并报告认证问题。它不能把失败降格为普通超时,也不能自动重试可能有副作用的动作。

关闭连接只能阻止后续使用,无法撤回已经到达对端或主动端点的记录。这是 False Start 的不可逆边界。路径机密性与“现在是否可以向这个端点披露”不是同一判断。

False Start 不是 0-RTT

RFC 8446 让 TLS 1.3 把低往返作为核心设计,并定义了不同的 0-RTT。会话恢复时,0-RTT 可在 ClientHello 后立即使用旧 PSK 派生密钥发送;它没有前向保密,也不能保证跨连接不被重放。

False Start 用于完整握手,使用新协商密钥,并等待到客户端自己的 Finished 之后。它面对的是服务器 Finished 尚未验证,不是 PSK 数据跨连接重放。

RFC 8470 为 HTTP 0-RTT 定义 Early-Data 与 425 Too Early。这些机制不属于 False Start。RFC 9325 要求应用协议明确说明何时可使用 0-RTT,也把 ALPN 与多服务器配置一致性视为控制。两类机制共享“必须理解应用”的原则,却不能混为同一种风险。

来源与边界

本文使用 RFC 5246、RFC 7301、RFC 7918、RFC 8446、RFC 8470 与 RFC 9325。这些文件不提供当前部署比例。False Start 不发送明文、不跳过证书、不恢复旧会话,也不需要服务器新增专用扩展。