rabbitmq 在TLS连接握手期间,客户端从哪里获取密码套件列表?

nxagd54h  于 2022-11-08  发布在  RabbitMQ
关注(0)|答案(1)|浏览(221)

客户端从哪里获取它要向服务器建议的密码套件列表?
例如,看起来在同一台机器上,两个不同应用程序的客户端可以建议不同的密码组列表。
为了限制问题的范围,我想了解RabbitMQ客户端和TLS1.2的情况。

更多说明

因此,我在我的机器上安装了RabbitMQ服务,然后在C#代码中,我尝试在没有任何密码套件配置的情况下连接(例如,var connection = factory.CreateConnection())到它。
因此,这里我的C#应用程序可以被视为客户端。
请注意,我询问的是客户端在“客户端Hello”消息中发送的密码。
另外,我在某个地方读到rabbitmq内部使用openssl,所以当我运行命令'openssl ciphers -s -tls1_2'时,我得到了一个列表,当我在wireshark中看到rabbitmq客户端hello的密码套装时,这个列表是不同的。而且我在机器上没有任何组策略覆盖密码。

lsmd5eda

lsmd5eda1#

请参阅https://tls13.ulfheim.net/,以获得TLS 1.3交换的良好图形表示。
在第二条消息ClientHello中,客户端给出了它支持的密码列表。它从哪里得到的?要么在应用程序中硬编码,要么在决定连接时动态计算,等等。这都取决于应用程序,所以你需要调查它的代码源/配置。
例如,如果您将openssl s_client作为TLS客户端,则可以使用-cipher-ciphersuites配置选项来指定连接时要声明哪些特定密码。
如果您稍后在交换中查看,会发现有一个ServerHello,服务器在其中宣布将使用哪个密码套件。
通常,服务器有自己的首选密码列表,这些密码按照“质量”排序(加密强度,如首选256位而不是128位,和/或其他属性,如首选PFS而不是非PFS),并根据从客户端获得的信息,尝试选择双方都支持的“最佳”密码,但这并不总是可能的。
现在,当您在注解中输入特定应用程序时(Google Chrome),你可以在https://source.chromium.org/chromium/chromium/src/+/main:third_party/boringssl/src/ssl/ssl_cipher.cc;l=1152?q=cipher&ss=chromium%2Fchromium%2Fsrc中看到一个名为“ssl_create_cipher_list”的函数的定义,它的目标是构建密码列表,从所有编译过的密码列表开始,然后应用各种规则来启用/禁用一些密码,并按照有意义的顺序对它们进行排序。当然,这在很大程度上取决于应用程序如何完成,但是您肯定可以在其他工具包中找到类似的操作。
最后,请注意TLS 1.2(密码)和TLS 1.3(密码套件)之间有一个很大的区别,它们是不相交的集合,当TLS 1.2有“无数”的密码时(例如,请参见https://www.openssl.org/docs/man1.1.1/man1/ciphers.html),TLS 1.3只定义了5个密码套件(请参见https://datatracker.ietf.org/doc/html/rfc8446#appendix-B.4),其中一个是强制实现的,因此客户端和服务器之间的自动协商几乎没有意义。
当你明确提到tls1.2作为标记时,请注意,现在没有真正的理由不使用1.3(这就是为什么我的第一个链接是专门针对1.3的-握手例程在1.2中是不同的,但在与密码问题相关的事情上是相同的),你将获得很多好处,简化的操作,更好的加密技术,以及更少的漏洞。

相关问题