我第一次遇到这个设置:
我的服务器证书由 INTERMEDIATE-CA1 签名,而后者又由 ROOT-CA1 签名。ROOT-CA1 位于我的浏览器/操作系统的信任库中。
话虽如此,ROOT-CA1 也由 ROOT-CA2 签名,后者也在我的浏览器/操作系统的信任库中。
这意味着,在一条信任路径上,ROOT-CA1 是 ROOT-CA(因此不需要由服务器发送),但在另一条信任路径上,ROOT-CA1 必须被视为 INTERMEDIATE-CA2,因此应由服务器发送。
显然,这不能同时实现,因为所选择的信任路径取决于客户端在其信任存储中拥有哪些 ROOT-CA。
所以我基本上要问两个问题:
- 哪种方法才是处理这种情况的正确方法?我的感觉是,作为服务器,我也应该发送 ROOT-CA1 证书,但我没有 RFC 依据
- 哪些是与 TLS 链验证相关的 RFC?
答案1
TLS 服务器根本不应发送根证书。简单明了。您需要发送叶证书(TLS 证书)和非根中间证书(如果有)。这解决了您这边的所有问题。
顺便说一句,证书仅由一个 CA 签名,证书中只有一个Issuer
字段。并且写在那里的 CA 是颁发者。另一个 CA 可以交叉签名证书,但不支持对叶证书进行交叉签名,因为您发送的是具有特定颁发者的证书,因此交叉签名者不会与链匹配。