多个可用证书链之间的选择如何工作?

信息安全 tls 证书 让我们加密
2021-08-31 05:37:06

我正在尝试了解交叉签名(中间)证书的实际机制。例如,我正在查看Let's Encrypt Chain of Trust该页面提到:

IdenTrust 已经交叉签署了我们的中间体。这允许我们的最终证书被所有主要浏览器接受,同时我们传播我们自己的根。

此外,该页面包含指向使用属于他们自己的 ISRG 根 CA 的私钥签名的中间证书的链接,以及使用属于 IdenTrust 的 CA 的私钥交叉签名的中间证书的链接

我的期望是在与 www.letsencrypt.org 建立 TLS 连接时,看到这两个中间证书通过网络传输,让客户端决定使用两个中间证书中的哪一个来构建信任链。但是,我只看到 IdenTrust 签署的中间文件。

我使用wireshark 观察到了这一点,在我使用Web 浏览器浏览www.letsencrypt.org 时分析了TLS 流量。为了强制“另一个”信任链,我不信任 Keychain Access 应用程序中的 DST Root CA X3 证书(我在 Mac 上),实际上我不再能够浏览该站点。然后我添加了 ISRG Root X1 证书,表示始终信任它,但我仍然无法浏览该站点。这支持了我的观察,即服务器永远不会提供由 ISRG 签名的中间证书。

我也尝试了该openssl s_client应用程序,但无济于事。

假设我碰巧信任 ISRG Root 而不是 IdenTrust,如何让服务器与我共享由 ISRG Root 签名的中间证书?或者更普遍地问,如果有多个信任链可用,例如由于交叉签名,两条链的证书如何与客户端共享?为什么我没有收到包含两个中间证书的捆绑包?


更新:第一个答案指出 TLS 规范不允许交换多个证书链。这解释了很多。

但是,我的期望是由对 X.509 中交叉签名证书的用途是什么问题的答案设定的. 那里接受的答案提到:“这是关于扩大信任”和“增加信任验证的便利性,例如您有信任 CA1 或 CA2(但不是两者)的客户的情况。在这种情况下,您可以跨-签署一份双方都信任的证书。”。

如果只允许交换一条链,那么这似乎不是“扩大信任”,而更像是“修改信任”。此外,对于一个特定的服务器,如果它必须选择一个特定的链,那么“易于验证”的论点也不再成立——至少如果你唯一可用的机制是 TLS 握手的话。那是对的吗?

1个回答

这个问题有点相关,从StackzOfZtuff 的回答可以看出只能发送一条链。当与它连接时,openssl s_client -connect letsencrypt.org:443它返回了 IdenTrust 根(IdenTrust 很久以前购买的数字签名信托公司)的链:

Certificate chain
 0 s:/CN=www.letsencrypt.org
   i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
 1 s:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
   i:/O=Digital Signature Trust Co./CN=DST Root CA X3

由于发送的证书链具有来自 IdenTrust 的签名,因此无法使用 ISRG 根进行验证。

正如这里所指出的,客户端没有义务使用服务器发送的链,它可能会尝试将自己的链构建到受信任的根。但是,这要求客户端已经拥有服务器未发送的所有必要中间体。

如果我将由 ISRG Root X1 签名的中间体添加到我的信任库中,s_client尽管被发送到 IdenTrust 链,但仍会发现该链(除非使用 告知不要这样做-no_alt_chains):

$ openssl s_client -connect letsencrypt.org:443
CONNECTED(00000003)
depth=2 C = US, O = Internet Security Research Group, CN = ISRG Root X1
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
verify return:1
depth=0 CN = www.letsencrypt.org
verify return:1
---
Certificate chain
 0 s:/CN=www.letsencrypt.org
   i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
 1 s:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
   i:/O=Digital Signature Trust Co./CN=DST Root CA X3