When/why 您需要在 TLS 协商中使用 CACert 吗?
When/why would you need to use CACert in a TLS negotiation?
我正在尝试了解用于配置 TLS 的参数(特别针对 rabbitmq,但我的问题可能更笼统)。
有 4 个主要实体需要考虑:
Key - 对等方用来解密发送给它的消息的私钥,这些消息已使用其 public 密钥加密。
Cert - 包含对等 public 密钥的证书
它还包含一些标识详细信息,如主机名、组织等。其中许多是可选的。
证书可以是未签名的(很少见?)、自签名或由证书颁发机构签名。
CACert - 对等方信任的 CA 证书,可用于解密和验证签名证书的签名。
CA-key - 用于签署证书的 CA 私钥。
这些映射到配置设置包括:
enablePeerVerification - 如果为 true,则对等方会尝试通过检查证书是否确实由 CA 签名来验证服务器是它所说的身份(同样向上信任链直到它到达它信任 CA,因为它在其本地 CA 信任库中有一个证书)。
将此设置为 false 是个坏主意,因为有人可能会冒充对方。
(在 go 中这个选项被称为 InsecureSkipVerify 作为警告)
如果证书是自签名的,则无法进行对等验证。
此选项允许您改用对等方的自签名证书
风险自负(例如在开发期间)。
Key - 用于解密的私钥
证书 - 用于加密(和握手)
CACert - 签署 "Cert" 证书的 CA 的证书
为什么有 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?
我正在尝试了解用于配置 TLS 的参数(特别针对 rabbitmq,但我的问题可能更笼统)。
有 4 个主要实体需要考虑:
Key - 对等方用来解密发送给它的消息的私钥,这些消息已使用其 public 密钥加密。
Cert - 包含对等 public 密钥的证书 它还包含一些标识详细信息,如主机名、组织等。其中许多是可选的。 证书可以是未签名的(很少见?)、自签名或由证书颁发机构签名。
CACert - 对等方信任的 CA 证书,可用于解密和验证签名证书的签名。
CA-key - 用于签署证书的 CA 私钥。
这些映射到配置设置包括:
enablePeerVerification - 如果为 true,则对等方会尝试通过检查证书是否确实由 CA 签名来验证服务器是它所说的身份(同样向上信任链直到它到达它信任 CA,因为它在其本地 CA 信任库中有一个证书)。 将此设置为 false 是个坏主意,因为有人可能会冒充对方。 (在 go 中这个选项被称为 InsecureSkipVerify 作为警告) 如果证书是自签名的,则无法进行对等验证。 此选项允许您改用对等方的自签名证书 风险自负(例如在开发期间)。
Key - 用于解密的私钥
证书 - 用于加密(和握手)
CACert - 签署 "Cert" 证书的 CA 的证书
为什么有 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?