摘要
NewSessionTicket给客户端的是未来握手可用的不透明 PSK 身份。服务器接受它,能把新 TLS 连接与签发票据的旧握手在密码学上连接起来;它不会复活旧传输连接,也不会自动证明应用状态仍然有效。- 票据寿命、年龄混淆值、nonce、KDF 哈希、SNI、PSK 模式和 binder 各自只回答一个有限问题。它们都不能单独证明当前授权、同一后端、同一租户路由、0-RTT 已被接受,或旧业务判断仍可执行。
- 可审计的恢复需要版本化状态契约、受限的票据密钥与服务接受范围、独立的 0-RTT 决策、对可变权限的重新核验,以及能按密钥代际撤销并可靠退回完整握手的路径。
密码学成功,业务判断却过期
事故表面上很简单。故障切换后的节点解开票据,找到关联状态,完成恢复握手,并把连接标成 resumed。应用随后从票据状态中取出用户身份和旧角色,跳过在线授权查询。
票据没有伪造,PSK 也没有错误。真正越界的是应用:它把“客户端能证明持有旧握手派生的秘密”解释成“旧连接上的全部业务判断今天仍然有效”。
两个时钟由此被压成一个。票据还在密码学有效期内,权限却已经在身份系统中撤销。TLS 只证明了前者;后者必须由掌握当前事实的系统重新回答。
票据标识的是新 PSK
当前 TLS 1.3 用统一 PSK 交换取代旧式 session ID 与 TLS 1.2 票据机制。客户端 Finished 之后,服务器可以发送 NewSessionTicket。每条消息把一个不透明票据值与恢复秘密和该票据独有的 ticket_nonce 所派生的 PSK 关联起来。
线上票据不必暴露内部结构。它可以只是数据库查询键,状态留在服务器;也可以是由服务器自行加密并认证、交给客户端保存的状态包。无论采用哪种方式,协议看到的都是 PSK 身份,不是旧连接本身。
同一连接可签发多张票据,供并行连接或不同接口竞速使用。每张票据因 nonce 不同而派生不同 PSK。审计系统若只保存“来自同一会话”,就丢掉了实际的凭证代际和使用范围。
恢复会建立新握手、新流量密钥和新的记录序号。旧 TCP 或 QUIC 路径、旧进程内存和旧应用事务不会因为票据被接受而回来。
寿命是客户端上限,不是服务器承诺
ticket_lifetime 从签发时刻计算,最长七天。零表示立即丢弃。客户端可以更早删除,服务器也可以把实际有效期设得更短。
因此,寿命字段只限制客户端还能尝试多久,不授予“在整个期限内必须恢复”的权利。服务器可以轮换票据密钥、删除数据库记录、缩小区域范围、撤销应用状态,或要求重新进行完整握手。
ticket_age_add 用每张票据独立的随机值遮蔽明文年龄,降低被动观察者关联连接的能力。客户端把年龄加上它,服务器再减回去检查误差。这不是主动防重放令牌;复制票据的人携带的是同一套年龄算术。
年龄超出容差时,规范允许继续握手,同时拒绝 0-RTT,也不得把 ClientHello 当作新鲜证据。普通 PSK 恢复与提前数据接受因此必须分开记录,不能压成一个“票据有效”布尔值。
Binder 证明秘密链,不证明所有旧事实
客户端在 ClientHello 中列出 PSK 身份和对应 binder。服务器选中兼容身份后,binder 证明当前握手由相应 PSK 认证,并通过恢复秘密把它传递地绑定到签发票据的原始握手。
这是一条强而有限的证明链。它能证明秘密持有与握手历史,不能给旧授权加上当前时间戳,也不能证明账户未冻结、设备姿态未改变、订阅仍有效或风险等级未调整。
PSK 恢复握手中,服务器不会重新发送 Certificate 与 CertificateVerify。旧认证上下文正在承担密码学作用。应用若把可变业务声明挂在该上下文上,就必须逐项说明哪些可以存续,哪些要向当前权威源重查。
OpenSSL 在握手后客户端认证完成时可以签发新票据,并把更新后的客户端身份与新票据关联。这恰好说明状态具有版本边界。新票据不会追溯改写旧票据;不能区分两代票据的系统,也无法可靠执行撤销。
当前服务名称不能被旧票据抹掉
恢复时,客户端仍在新 ClientHello 中发送当前 SNI。客户端只能在原证书对新名称有效时恢复,通常也应保持与原连接相同的 SNI。实现若向应用报告 SNI,必须使用本次 ClientHello 的值,而不是历史值。
RFC 9525 同样把服务身份视为当前应用输入。SNI 与 ALPN 帮助确定请求的是哪个服务和协议。票据能够解密,不等于它天然适用于所有名称、租户或协议。
多个区域共享票据包装密钥,是权限范围选择。它能提高故障切换成功率,也会扩大能解释旧状态的节点集合。BoringSSL 把跨名称恢复暴露为明确策略,而不是把它当作“能解密就接受”的默认结论。
KDF 哈希也是硬边界。票据只能与使用同一 KDF 哈希的密码套件恢复。参数兼容只证明密码学可组合,不授权应用保留旧路由或旧权限。
恢复连接与提前执行是两件事
NewSessionTicket 可以带 early_data 扩展和字节上限,使客户端有资格在下次握手中提出 0-RTT。资格不是接受,接受也不是业务操作安全。
监控必须分开三件事:票据解密或查询成功、PSK 被选为本次握手依据、0-RTT 被接受。年龄可疑、防重放存储不可用或应用参数变化时,服务器可以拒绝提前数据,却仍完成普通恢复握手。
HTTP 425 管理的是更后的边界:来源站点拒绝在可跨连接重放的时机执行某个请求。它不定义票据本身能携带多少状态。本报告在全面禁用 0-RTT、只做 1-RTT 恢复的环境中仍然成立。
QUIC 又增加一层连续性判断。其 0-RTT 还依赖旧传输参数与应用参数。TLS 票据有效,不能代替 QUIC 限制或 HTTP/3 SETTINGS 的兼容证明。
存储方式决定接受域
数据库型票据可以在使用后删除、限制到单一权威存储,并记录消耗顺序。代价是数据库可用性、复制延迟和跨节点一致性直接影响恢复。
自包含票据不需要逐票查询,在节点故障时更容易继续服务。但持有同一包装密钥的节点通常都能解释其中状态,直到密钥被退役。密钥复制范围因此也是状态权限范围。
这不是“有状态安全、无状态不安全”的二分。数据库延迟可能造成重复接受或错误拒绝;过宽的包装密钥分发可能把局部判断扩大到整个区域;过长的密钥重叠期会让旧状态存续更久。
OpenSSL 暴露解密状态、密钥名、票据应用数据、签发数量与禁用开关。GnuTLS 提供服务器票据和追加签发控制。BoringSSL 的运行代码生成新的年龄偏移、限制数量,并把提前数据作为单独条件。
这些接口证明“可以控制”,不证明某进程实际加载了哪个代际、轮换是否一致、票据包含什么声明,或接收节点是否重查当前授权。
哪些状态可以跨连接
稳定的密码学事实适合携带:PSK 身份、KDF 哈希、恢复模式,以及对已认证握手的有限引用。会改变的业务事实需要自己的失效规则。
应用可以在认证票据状态中保存用户 ID 与授权版本号,恢复时再向权威系统核验版本;可以携带带过期时间的租户路由,并在拓扑变化后拒绝;也可以在客户端证书状态改变后签发新代票据。
危险设计保存的是结论,而非证据,例如“管理员=true”“设备可信”“订阅有效”“撤销检查通过”。加密与完整性保护能防止未授权篡改,却阻止不了一条真实旧结论自然过期。
EAP-TLS 用一张或多张票据进行认证恢复,并遵守七天上限。这说明应用画像必须定义“恢复认证”意味着什么,也必须定义凭证和接入策略变化后何时禁止捷径。TLS 提供载体,部署系统承担当前授权。
能经受故障切换的证据
保存隐私安全的票据关联值或密钥名、签发节点和区域、签发时间、声明与实际到期、密钥代际、存储方式、PSK KDF 哈希及 PSK 模式。票据再次出现时,记录客户端年龄、解密或查询结果、选中身份序号、当前 SNI 与 ALPN、普通恢复结果和完整握手回退。
0-RTT 另行记录:是否提出、是否具备密码学条件、接受或拒绝、字节上限、防重放状态和应用决定。禁止让 resumed=true 暗含 early_data_accepted=true。
应用证据还应包括状态结构版本、授权版本、撤销查询、租户路由版本和每个当前判断的权威来源。关联值可以连接签发与接受记录,但不得泄露票据或 PSK。
负面测试包括:过期票据、服务器缩短有效期、未知或退役密钥名、认证失败、数据库条目删除、跨区域复制、SNI/ALPN 变化、KDF 哈希不兼容,以及“票据密码学有效但用户已撤权”。
回退也必须被证明。票据拒绝后,应在策略允许时成功执行完整握手。紧急控制应能只退役一个票据密钥代际或一个应用状态版本,而不破坏无关 TLS 服务。
来源
- https://www.rfc-editor.org/rfc/rfc9846.html
- https://www.rfc-editor.org/rfc/rfc9325.html
- https://www.rfc-editor.org/rfc/rfc9190.html
- https://www.rfc-editor.org/rfc/rfc9001.html
- https://www.rfc-editor.org/rfc/rfc8470.html
- https://www.rfc-editor.org/rfc/rfc9525.html
- https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml
- https://docs.openssl.org/master/man3/SSL_CTX_set_num_tickets/
- https://docs.openssl.org/master/man3/SSL_CTX_set_session_ticket_cb/
- https://docs.openssl.org/master/man3/SSL_CTX_set_options/
- https://www.gnutls.org/manual/html_node/Session-tickets.html
- https://www.gnutls.org/manual/html_node/Session-resumption.html
- https://boringssl.googlesource.com/boringssl/+/refs/heads/main/ssl/tls13_server.cc
- https://heng.lu/running-code-primary-the-patch-needed-to-preserve-the-internet-original-design/
会员简报
档案背景详情
使用相应会员等级登录,即可解锁完整简报与来源注释。
仅限 Strategic Circle
Strategic Circle
所有读者均可浏览。加入并登录后可解锁档案简报。
加入 Strategic Circle仅限 Leadership Alliance
Leadership Alliance
符合条件的 IP 资产所有者和管理层可登录查看 Leadership Alliance 简报。
加入 Leadership Alliance
