何时/为什么需要在TLS协商中使用CACert?

时间:2018-10-12 13:17:12

标签: ssl rabbitmq ssl-certificate rabbitmq-c

我试图了解用于配置TLS的参数(特别是对于Rabbitmq,但我的问题可能更笼统)。

要考虑4个主要实体:

  • 密钥-对等方用来解密发送给它的已使用其公钥加密的消息的私钥。

  • 证书-包含对等方公钥的证书      它还包含一些标识详细信息,例如主机名,组织等。其中许多是可选的。      证书可以是未签名的(如果有,很少吗?),自签名或由证书颁发机构签名。

  • CACert-对等方信任的CA证书,可用于解密和验证已签名证书的签名。

  • CA密钥-用来签署证书的CA私钥。

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

  • enablePeerVerification-如果为true,则对等方尝试通过检查证书确实是由CA签名(并同样向上信任链,直到到达它信任的CA为止)来验证服务器是它所说的服务器它在其本地CA信任库中有一个证书)。 将其设置为false是一个坏主意,因为有人可能会冒充同行。 (此选项作为警告被称为InsecureSkipVerify) 如果证书是自签名的,则对等验证是不可能的。 此选项使您可以使用对等方的自签名证书 风险自负(例如在开发过程中)。

  • Key-用于解密的私钥

  • 证书-用于加密(和握手)

  • CACert-签署“证书”证书的CA的证书

为什么有CACert的配置设置?

如果证书是由CA签名的,则它已经包含足够的信息来定位CA(例如域名)。 CACert的作用是什么?在TLS协商过程中何时发送CACert? 这是直接保存到CA的便利吗? 如果CACert与您的信任库中的一个不匹配或指向一个,则仍然需要这样做。

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

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

1 个答案:

答案 0 :(得分:1)

首先,此处的CA私钥与此处无关,因为根据定义,它是私​​钥,因此除非拥有自签名证书,否则您永远不会拥有它。

TLS握手是:

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

然后,取决于客户端,您可能具有多个配置项: -作为中间发送的证书列表(作为指向某个目录的路径或包含所有目录的单个文件)以及其自己的客户端证书 -您完全信任的证书(用于目录或文件)证书列表,用于验证服务器证书。

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

现在:

  

如果证书是由CA签名的,则它已经包含足够的信息来定位CA(例如域名)。

不确定是否了解您,但总体而言不。首先,证书不一定是/仅针对域名,也可以是其他。然后,证书通常是由中间人签署的,而不是由CA直接签署的。所以我不确定您要如何找到CA?