TLS 客户端是不是需要在信任库中有中间 CA?
Posted
技术标签:
【中文标题】TLS 客户端是不是需要在信任库中有中间 CA?【英文标题】:Does a TLS client needs to have intermediate CA in the trust store?TLS 客户端是否需要在信任库中有中间 CA? 【发布时间】:2019-02-10 02:20:09 【问题描述】:当发生 TLS 握手时,服务器会发送他的 ServerHello 消息,即他的数字证书。该数字证书由名为 A 的中间 CA 进行数字签名,并且 CA A 也有一个证书,该证书由名为 root 的 CA 签名,其证书是自签名的,从而形成证书链。然后客户端必须建立信任,验证服务器证书。要执行该验证,客户端必须验证整个链是否正确? 客户端必须在信任库中拥有所有证书(A 和 Root),否则客户端会下载它们?
【问题讨论】:
没有。客户端只需要其信任库中链中的 any 签名证书,通常是最顶层的。客户端必须验证它已经信任的整个链。 (1) 服务器应该发送完整的链,直到但可选地不包括根或锚;请参阅 RFC。它在证书消息中执行此操作,而不是在 ServerHello 消息中。 (2) 如果服务器发送链失败,客户端可能有缓存,加上现在很多 CAs包括AuthorityInfoAccess扩展,客户端可能 i> 使用它来获取丢失的非根,但它因客户端而异。根目录或锚点必须预先安装,而不是下载,因为下载内容可能被篡改或伪造。 请注意,此类问题最好在Information Security提出。 【参考方案1】:客户端通常在本地信任存储中只有根 CA。通往根CA的叶子证书和中间证书需要由服务器提供。除了 TLS 握手中的叶证书之外,通常还会发送中间证书。
但是只有服务器发送叶子证书是典型的错误配置。在这种情况下,证书验证将失败,除非客户端已经知道中间证书或可以通过某种方式获得这些证书。由于经常使用相同的中间证书,某些浏览器(如 Firefox)会缓存它们在与服务器 A 通信时将获得的中间证书,并在损坏的服务器 B 未发送所需的中间证书时填充这些证书。其他浏览器(如 Google Chrome)将尝试从 Internet 下载缺少的中间证书。大多数简单的客户端(即用 Python、Java ... 或 curl 编写的应用程序)只会因证书验证错误而失败。
【讨论】:
感谢您的澄清,对我帮助很大。以上是关于TLS 客户端是不是需要在信任库中有中间 CA?的主要内容,如果未能解决你的问题,请参考以下文章