摘要

  • RFC 9654 要求实现该扩展的新请求方用密码学强伪随机数生成器产生至少 32 字节的 nonce;响应中精确回显该值,可把响应绑定到本次请求并抵御旧响应替换。
  • 相等结果不证明响应者已经摄取最新吊销数据,也不证明签名授权、目标 CertID、签名时间窗口、证书路径或应用许可成立。
  • 可复核收据必须分别保存请求与响应原始字节、nonce 生成和比较、签名者授权、证书标识、时间字段、上游数据水位、本地验证策略与最终会话动作。

第一扇门打开之后

安全界面很容易把一个清晰的布尔值当成结论:nonce matched。这个值确实重要。攻击者若只拿着先前获得、携带另一随机值的响应,就无法把它冒充成本次询问的答案。

RFC 9654 规定,请求方把 nonce 放在 requestExtensions,响应方若回显则放在 responseExtensions,两边都使用 id-pkix-ocsp-nonce。精确匹配建立的是一条加密绑定:这份响应对应这次请求,而不是另一份旧副本。

但证据链并未在这里结束。响应可能从延迟的吊销数据副本生成;它可能包含另一个证书的状态;签名证书可能不具备代表相关 CA 签署 OCSP 的权限;状态时间可能不符合本地策略;即使 OCSP 全部有效,应用仍需完成证书路径、名称与业务权限判断。

允许范围不是统一承诺

RFC 9654 把 Nonce 定义为 1 到 128 字节的 OCTET STRING。现代请求方必须使用至少 32 字节。支持该扩展的响应方必须接受 16 到 32 字节;对 1 到 15 字节或 33 到 128 字节,可以选择不在响应中带 nonce;长度为 0 或超过 128 时必须返回 malformedRequest。

因此,128 字节是语法上限,不是所有服务都必须回显的推荐长度。RFC 8954 的上限是 32 字节,旧实现不能被假定理解更长值。新规范为某些会产生长 nonce 的密码算法留下空间,同时把最可靠的互操作区间保留得很明确。

测试不能只问“服务器是否接受请求”。至少要覆盖 16、32、33 和 128 字节,以及禁止的 0 和 129 字节;分别记录回显、无 nonce 响应与拒绝。一个总体成功率会把不同安全分支混成同一个数字。

外层与内层都必须留下来

编码同样构成证据。扩展的 extnValue 是外层 OCTET STRING,其中封装了作为内层 OCTET STRING 的 Nonce。RFC 9654 给出的 32 字节示例清楚显示这两层。

解析器可以识别正确 OID,却取错比较层;日志可以只保留十六进制前缀;不同库可以对封装或裸值做比较。于是“扩展存在”并不等于“值被正确解码并精确比较”。

合格收据应保存完整 DER 请求和哈希、完整响应和哈希、扩展位置、外层长度、内层长度与逐字节比较结果。IANA PKIX 模块标识登记中的 111 和 112 协调两套 ASN.1 模块名称;登记本身并不证明运行中的解析器遵循了它们。

长度不能替代不可预测性

RFC 9654 要求用密码学强伪随机数生成器,并引用 RFC 4086。原因是:若攻击者能预测客户端下一次使用的值,就可以提前取得带该值的响应;若空间太小,就能穷举所有可能响应。

事后比较仍可能完全相等,但防重放意义已经丧失。监控必须从生成时开始,记录生成器类型与健康状态、生成时刻、长度、跨请求是否复用、进程重启后是否重复。仅记录“32 字节”只能证明格式,不能证明它为本次请求新鲜生成且不可预测。

这体现了运行代码优先:标准给出不变量,加载的生成器、实际字节、捕获和比较结果才说明某次执行是否兑现它。

最新响应也可能建立在滞后状态上

RFC 9654 说,包含请求方 nonce 的响应可确保这是服务器最新响应,而不是旧副本。这里的主语是“来自该服务器的响应”。它没有为服务器上游的数据摄取链作担保。

RFC 6960 分开定义 producedAt、thisUpdate、nextUpdate 与 revocationTime。producedAt 是签名时间;thisUpdate 是响应方确认状态正确的最近时间;nextUpdate 表示何时会有更新信息。CertID 则由颁发者名称哈希、密钥哈希与证书序列号确定目标。

假设 CA 在 10:00 发布吊销,响应服务到 10:05 才摄取;10:03 时,它完全可以针对新 nonce 动态生成一份新响应,并用它掌握的旧状态正确签名。这份交换在请求层面是新的,对权威状态变化却滞后。要证明后者,需要源批次、复制水位或等价的摄取收据。

签名权限也是独立关口。RFC 6960 要求签名者是颁发 CA、请求方直接信任的响应者,或由该 CA 直接授权并持有相应证书的响应者。nonce 不授予这种权力。good 也只说明响应者没有记录该序列号在相应条件下已吊销,并不自动证明证书确曾签发、仍在有效期、身份正确或应用应当授权。

缺失是另一条路径,不是不匹配

RFC 5019 面向大规模 OCSP,允许预生成与缓存响应。每个请求都生成独特响应会削弱这些能力。因此,响应者可以在请求带 nonce 时仍省略它;若客户端无法确认服务器支持 nonce,不应仅因缺失拒绝,而应回退到签名时间验证。

RFC 9654 同时指出残余风险:路径攻击者可能返回一份不含 nonce 的较早服务器响应。缩短 thisUpdate 到 nextUpdate 的间隔可限制重放窗口。这个状态与“精确匹配”“值不同”“报文畸形”都不相同。

运营至少应分四类:存在且相等;按策略缺失并进入时间回退;存在但不等;编码或长度错误。每一类后面都要继续记录签名、权限、证书标识、时间判断和应用结果。

把证据链写成可重放记录

第一层保存目标证书指纹、序列号、颁发者哈希与预期响应者。第二层保存请求字节、nonce 生成器、时间、长度和值哈希以及传输目的地。第三层保存响应字节、响应状态、响应者身份、签名链、授权与签名验证。

第四层保存 nonce 是否存在及是否完全相等。第五层保存 CertID、状态、producedAt、thisUpdate、nextUpdate 和吊销字段。若可观察,还要单独保存上游源数据水位。第六层保存客户端时钟、不确定度、容差、验证器版本和策略。应用层最后保存证书路径、身份、放行理由与会话动作。

现实层次要求这些相邻事实互不冒充。最小初始规范则把共享规则放在正确位置:编码、长度、随机性和比较必须一致;数据摄取、部署取舍与应用风险仍由明确的本地责任人承担。

来源