依赖名称约束或中间 CA 固定?

信息安全 公钥基础设施 证书颁发机构
2021-08-22 06:26:03

公开了两种不同的服务,称为“猫服务”和“狗服务”。“猫”和“狗”通过客户端证书对服务进行身份验证。客户端证书在主题(或 SAN)字段中具有猫和狗身份。

PKI 层次结构如下:

           root CA
        /           \
   cat CA            dog CA
     /                 \
cat client certs     dog client certs

我想阻止 cat 服务 CA 运营商颁发狗客户端证书(反之亦然)。

似乎有两种选择:

  1. 在中间 CA 上使用名称约束证书扩展。在这种情况下,服务器被配置为信任根 CA。现在,如果客户端发送由 cat CA 签名的狗证书(+cat CA 作为 cert.chain 的一部分),则服务器会发现矛盾并在验证根 CA 之前拒绝。

  2. 让“猫服务”侦听器固定中间“猫 CA”,让狗服务固定“狗 CA”。在这种情况下,服务器不信任根 CA。

  3. 正如 garethTheRed 在评论中所指出的,还有第三个选项:>> 使用证书策略将每个 CA 路径限制为一个 OID。让根 CA 使用它自己的 OID 颁发每个子 CA 证书,并让服务器在客户端证书的路径验证期间检查这一点。

这三种方法的优点/缺点/比较是什么?

注意:这个问题不同于由同一个根 CA 签名的两个中间 CA 是否信任彼此签名的客户端证书?因为它询问列出的两种方法中的任何一种是否有任何特定的不利因素/不利因素。

1个回答

我更喜欢选项#2,因为它易于理解,易于在不同的堆栈中实现。

选项 #1,您需要为两个服务定义互斥的名称约束,可能会使证书颁发更加困难(在颁发 cat/dog 客户端证书之前需要进行额外检查),确保您使用的证书链验证库正确尊重名称约束扩展等

我知道你提到验证将在服务上完成,你可以更好地控制它,但如果验证必须由浏览器完成,Safari/IE 和其他浏览器可能无法正确实现它。