摘要

  • draft-hdong-dnsop-ml-dsa-mtl-dnssec-sigtag-ext-00 用 EDNS(0) 携带最多八个 SigTag;匹配时,服务器可省略完整 signed ladder,仅发送 condensed signature。
  • SigTag 是对 signed ladder 序列化结果计算出的 32 字节标识,不证明客户端仍保存该梯子,更不证明其绑定、验证或 DNSSEC 最终结果正确。
  • 真正可运营的方案必须保留完整签名回退、按签名者划分的缓存证据、隐私控制,以及从解析验证到应用使用之间的独立记录。

被省略的是传输,不是证明

ML-DSA-MTL 把 DNSSEC 签名拆成两类材料。condensed signature 携带 Merkle authentication path;signed ladder 携带底层 ML-DSA 签名。一条梯子可以覆盖多个 RRset,于是签名和验证成本可以摊薄,但基础草案指出,完整响应仍会超过 DNS over UDP 的容量。

SigTag 的办法不是把梯子压得更小,而是让本次响应不再重发。客户端对 signed ladder 全部序列化字段计算 SHAKE128(SIGNED_LADDER, 256),把所得标识放进 EDNS(0) 选项。服务器找到匹配梯子时,可把对应 RRSIG 设为 0x02 的 condensed 类型;没有匹配,或服务器已经不持有那条梯子,就必须返回 full signature。

因此,网络上少了几千字节,解析器本地却多了一项状态责任。它必须拿出正确 signed ladder,验证其签名,再用 condensed path 把 RRset 连接到相容 rung,最后继续完成普通 DNSSEC 信任链验证。标识吻合只决定服务器可以采用哪种响应格式,不替代任何一步密码学判断。

同一个标签背后有三套状态

查询表达的是“客户端相信自己知道这条梯子”。它不是 possession proof。构造查询后,缓存可能被驱逐;梯子可能损坏;同一 SID 可能出现在另一个签名者下;缓存索引也可能漏掉密钥轮换。基础草案特别要求把缓存梯子与 signer name 关联,说明 SID 本身不能充当全局身份。

服务器持有的是另一套状态。即使查询给出匹配标签,服务器若已失去相关 ladder,也必须回到完整签名。线路上的 condensed signature 又是第三套状态:它的 SID、leaf index、目标 rung 和 sibling hashes 必须和解析器实际取出的 ladder 对得上。三者不能被一个“tag matched”计数器合并。

空选项揭示了这一区别。尚不知道任何标签的客户端可以发送长度为零的 SigTag,表示自己理解该机制。支持它的服务器也返回空选项;同一响应中若多个 RRSIG 共用梯子,服务器可只在第一个放 full signature,后续放 condensed signature。这个 echo 只说明协议能力,不是验证成功回执,而且客户端必须忽略响应选项里的数据。

回退不是补丁,而是可用性边界

草案给出三条验证失败后的路:带空 SigTag 重试、不带 SigTag 重试以取得完整签名,或改问另一台 DNS 服务器。mismatched condensed signature 与 missing payload 都是明确例子。若实现只有“命中后省略”而没有这些恢复路径,优化就会变成新的单点依赖。

传输选择同样留在本地。担心重试的客户端可以直接用 TCP;另一种实现可先发 UDP,再根据截断切换。完整 MTL 响应必然超出 UDP,并不意味着每个 condensed 响应都能装下、能到达或能验证。运行证据必须把响应字节、截断、TCP、重试、换上游、验证结果和最终解析状态拆开。

缓存标签也会泄露历史

非空 SigTag 会告诉权威服务器:这个客户端此前见过某条 ladder。草案因此警告,标签可能暴露查询历史;如果权威端为不同客户端制造不同梯子,还可能用于跟踪。只发送空选项可以保留单响应去重,却不暴露已知标签;改变地址或接口时清理相关缓存,也是草案建议的限制办法。

二者都不是隐私保证。稳定标签可与 IP、时序等信号合并;频繁清理又会损失带宽收益。这个取舍应由承担后果的解析器运营者决定,而不是由权威端或软件供应商把“披露历史”藏进默认优化开关。

代码、编号和运行结果必须分开

第 00 版发布于 2026 年 9 月 28 日,EDNS option code 与新 MTL-Type 登记仍为 TBD。草案列出 LDNS、NSD 和 Unbound 的测试实现,但同一节也说明这些信息由贡献者提供,未作独立验证,不构成 IETF 背书。

IANA 编号将来可以让字段含义一致,却不能证明解析器保存了正确梯子。代码仓库可以证明有人实现过路径,却不能证明生产失败率。真正的 running-code 证据应包括准确版本、互通测试、逐步验证回执、回退分布和可重复的线路数据。

来源