When/why 您需要在 TLS 协商中使用 CACert 吗?

When/why would you need to use CACert in a TLS negotiation?

我正在尝试了解用于配置 TLS 的参数(特别针对 rabbitmq,但我的问题可能更笼统)。

有 4 个主要实体需要考虑:

这些映射到配置设置包括:

为什么有 CACert 的配置设置?

如果证书是由 CA 签名的,那么它已经包含足够的信息来定位 CA(例如域名)。 CACert 的用途是什么,它是否或何时在 TLS 协商期间发送? 这只是为了省去直接去 CA 的麻烦吗? 如果 CACert 不匹配或指向您的信任库中的一个,您仍然必须执行此操作。

我指的设置是服务器 rabbitmq.config 中的 "cacert" 和 amqp_ssl_socket_set_cacert( ) 在 C API (rabbitmq-c).

我想检查一下我的理解是否正确(https://xkcd.com/386/)

首先这里的 CA 私钥在这里是无关紧要的,因为根据定义它是私有的,因此你永远不会拥有它,除非你有自签名证书。

TLS 握手是:

  • 您要连接的服务器会向您发送其证书,并可选择地向您发送直到根 (CA) 的中间证书列表,最后一个也是可选的,并且通常不会发送,因为客户端应该拥有它已经在其信任库中
  • 如果服务器请求客户端证书,它会发送它将接受客户端证书的 CA 列表(这是帮助客户端选择要发送的正确证书的提示)
  • 因此,如果需要,客户端会发送其证书,并以与第一点相同的方式发送一个潜在的中间证书列表,直到某个根。

根据客户端的不同,您可能会有多个配置项: - 作为中间件发送的证书列表(作为某个目录的路径或包含所有文件的单个文件)连同其自己的客户端证书 - 您使用的证书列表(同样是目录或文件)完全受信任以验证服务器证书。

通常,这两个设置只有一个。

现在:

If the cert is signed by a CA then it already contains enough information to locate the CA (e.g. domain name).

不确定你是否理解,但总的来说不会。首先,证书不是 necessarily/only 用于域名,它可以用于其他东西。然后证书通常由中间人签名,而不是直接由 CA 签名。所以我不确定你想如何定位 CA?