证书链构建过程总结

3 阅读6分钟

证书链构建过程总结

证书构建的使用场景

目前发现DFS构建算法有2个使用场景:

  1. 判断指定证书是否可信时,需要先为其构建证书链,然后通过验证整个链来验证整个证书的有效性来判断是否可信
  2. 收到ocsp response时,需要使用DFS算法为response的签名证书构建证书链,接着需要通过验证证书链的有效性来判定response是否可信

证书链构建算法骨架

DFS/向上查找直到trust anchor出现/排序/快速验证/回溯/签名验证/策略

当构建过程中某个地方有多种实现方式时,这些“多种”就可以现实为可配置选项。

对于给定的目标证书,当DFS构建算法找到候选链以后,会立即提供给调用者;调用者可以需要进行判断:如果调用者由于一些原因拒绝了候选链,可以继续尝试从dfs算法中获取下一条。

  1. 如果接受这条链,则构建算法成功完成
  2. 如果拒绝这条链,则可以尝试等待DFS构建算法找下一条候选链

流程总结

DFS+贪心策略

假设我们要为目标证书构建证书链。

从目标证书开始,查找 满足 快速验证 的上级证书,然后将验证通过的证书进行 排序 ;选择位于 排序 第一位的证书,用它的 公钥验 证当前证书的签名 ,接着对它重复刚刚向上延伸的过程。

如果在向上延伸的过程中,某个上级证书匹配了某个本地的Trust Anchor(1.排序以后位于第一的证书 2.回溯 到的位置上,下一个待尝试的上级证书), 则表示候选链出现。DFS构建算法此时可以将候选链交给调用者,如果候选链被接受,证书链成功构建。

当出现一下情况时,可以根据策略选择终止整个构建流程还是尝试 回溯 到最近一个具有可用候选上级的位置:

  1. 在本地找不到对应的trust anchor
  2. 快速验证不通过
  3. 成功构建候选链,但是候选链被拒绝(例如吊销验证不通过)
  4. 构建过程中的其他错误

如果选择回溯,则回到最近一个还有未尝试候选上级的证书节点。将排第一未的尝试候选上级作为下一个尝试证书,用它的公钥验证当前证书的签名。如果通过则 以它为基准,继续重复向上延伸的过程。如果验证失败,则根据策略终止构建流程或者继续尝试回溯。

特别的,如果选择了 回溯 但是没有可 回溯 的位置时,构建显然失败。

信任锚点(trust anchor)

在 RFC 5280 中的定义包含三个元素:公钥、Subject 名称、以及可选的约束(Constraints)。虽然在现实中它通常表现为设备上的自签名根证书 (Self-signed Root CA),但它也可以只是一个公钥和名称(没有证书外壳)

当 DFS 搜索到的候选上级证书的颁发者(Issuer)和公钥匹配了某个 trust anchor 时,DFS 立即终止。此时,整条 Path(从目标证书到 TA 派生的证书)构建完成

证书查找

dfs算法在构建证书链时查找证书手段分为:1.本地查找 2.网络查找。具体查找方式取决于配置的查找策略或者具体实现。

构建验证证书过程中的验证(Validation)

将证书链的构建验证过程中的判断根据耗时程度分解为:

  1. 快速验证(例如验证证书字段/一些全局设置例如max path length/Loop Detection)
  2. 验证证书签名(因为略微耗时)
  3. 验证吊销状态(非常耗时)

以此来方便在减少细节涉及的情况下讨论证书构建过程。

快速验证

不耗时的快速判断。

环路检测(Loop Detection)

当将准备将新证书放入当前候选链(Current path)时,如果它的Subject Name 和 公钥与当前链上已有证书的Subject Name 和 公钥完全一致,则表示发生环路。

在本次讨论中,将环路检测归到快速验证一类中。

验证证书签名

每当找到当前证书的一个上级证书时,需要用这个上级证书的公钥验证当前证书的签名。

验证吊销状态

吊销验证不属于dfs构建算法的范围。不过当dfs构建算法找到一条候选链时,调用者可以对他执行吊销验证。

排序:多个候选上级证书

在构建候选链时,如果找到了证书的多个候选上级证书,会对这些候选证书进行排序,然后依次优先使用排位靠前的证书继续执行后续逻辑。

RFC中没有规定如何排序。在目前的实现当中,通常会按照成功的可能性排序(启发式贪心算法);排序时可能会参考:

1. 证书有效期与新鲜度(Validity and Freshness) 有效期长的排在前面

2. 密钥标识符(AKID / SKID)的精准匹配度

3. 自签名证书与交叉证书(Self-signed vs. Cross-certified)

4. 签名算法与密钥强度(Signature Algorithm and Key Strength) 安全性更好或者密钥更长的排在前面

回溯(Backtracking)

当快速验证不通过/签名验证不通过/证书被吊销时,可以触发回溯;回到当前候选链上上一个还有未尝试过的候选证书的地方。如果没有这样的地方则构建失败。

策略

在构建过程中,会遇到对于当前状态,可以进行多种选择的情况。这个时候就需要根据配置的策略来确定如何进行后续操作。

其他:构建验证证书相关RFC中定义的部分术语

证书链叫做 Path ;验证条件统统的叫做 Input Constraints;构建证书链叫做 Path Development/Path Construction ; 证书链如果由于一些原因构建失败叫做 Failure ;这个时候会放弃这条链,叫做 Abandoning

rfc5280与rfc4158

rfc5280: 定义了证书链验证的严格算法(主要是前向路径验证,侧重合法性校验规则)。

rfc4158: 定义了如何在不违反 rfc5280 的情况下构建并验证证书链(侧重于复杂的图搜索、路径发现、容错与兼容性指南)。

证书签名验证时机

  • rfc规定候在构建候选链时只需要让其通过快速验证,构建好以后在对候选链进行证书签名验证
  • 实践中当即将要选定当前尝试的候选上级证书时,需要用其的公钥来验证当前证书的签名