我试图了解用于配置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/)
答案 0 :(得分:1)
首先,此处的CA私钥与此处无关,因为根据定义,它是私钥,因此除非拥有自签名证书,否则您永远不会拥有它。
TLS握手是:
然后,取决于客户端,您可能具有多个配置项: -作为中间发送的证书列表(作为指向某个目录的路径或包含所有目录的单个文件)以及其自己的客户端证书 -您完全信任的证书(用于目录或文件)证书列表,用于验证服务器证书。
通常,这两个设置只是一个。
现在:
如果证书是由CA签名的,则它已经包含足够的信息来定位CA(例如域名)。
不确定是否了解您,但总体而言不。首先,证书不一定是/仅针对域名,也可以是其他。然后,证书通常是由中间人签署的,而不是由CA直接签署的。所以我不确定您要如何找到CA?