TLS 客户端是否需要在信任存储中拥有中间 CA?

And*_*ero 2 ssl ssl-certificate

当发生 TLS 握手时,服务器发送他的 ServerHello 消息,他的数字证书。该数字证书由名为 A 的中间 CA 进行数字签名,CA A 也有一个由名为 root 的 CA 签名的证书,其证书是自签名的,从而形成一个证书链。然后客户端必须建立信任,验证服务器证书。要执行该验证,客户端必须验证整个链是否正确?客户端必须在信任库中拥有所有证书(A 和 Root),否则客户端会下载它们?

Ste*_*ich 5

客户端通常在本地信任存储中只有根 CA。叶证书和通向根 CA 的中间证书需要由服务器提供。除了 TLS 握手中的叶证书之外,通常还会发送中间证书。

但是,仅让服务器发送叶证书是典型的错误配置。在这种情况下,证书验证将失败,除非客户端已经知道中间证书或可以以某种方式获得这些证书。由于经常使用相同的中间证书,因此某些浏览器(如 Firefox)会缓存它们在与服务器 A 通信时获得的中间证书,并在损坏的服务器 B 未发送所需的中间证书时填写这些证书。其他浏览器(如 Google Chrome)将尝试从 Internet 下载缺少的中间证书。大多数更简单的客户端(即用 Python、Java ... 或 curl 编写的应用程序)只会因证书验证错误而失败。

  • @Teenage:AIA 是可选的。动态查找丢失的证书还不仅需要连接到实际的目标服务器——这不能假设在所有环境中都是可能的。动态查找也增加了复杂性。而且它们会增加延迟。也就是说:如果不提供中间体,Chrome 实际上会使用 AIA。 (2认同)