当使用依赖于差异地狱人密钥交换的SSL密码时,所用私钥的大小对于该密钥交换的安全性至关重要。
当我使用“ openssl s_client”工具连接到服务器时,如何查询所用的DH参数?
当使用依赖于差异地狱人密钥交换的SSL密码时,所用私钥的大小对于该密钥交换的安全性至关重要。
当我使用“ openssl s_client”工具连接到服务器时,如何查询所用的DH参数?
Answers:
我不知道易于使用的命令行开关,但是在openssl s_client
命令行中,您可以添加该-msg
选项以获取握手消息的十六进制转储。然后寻找ServerKeyExchange
消息;它应该看起来像这样:
<<< TLS 1.2 Handshake [length 030f], ServerKeyExchange
0c 00 03 0b 01 00 ff ff ff ff ff ff ff ff c9 0f
da a2 21 68 c2 34 c4 c6 62 8b 80 dc 1c d1 29 02
4e 08 8a 67 cc 74 02 0b be a6 3b 13 9b 22 51 4a
(...)
它的读取方式是:
0c 00 03 0b
:类型为“ ServerKeyExchange”(即“ 0c”)的消息,其长度为0x00030B字节。01 00
,表示在0x0100字节上编码的整数。这是256个字节,因此模数的长度在2041和2048位之间。ff ff ff ff...
。模数的长度恰好为2048位。如果使用ECDHE密码套件(椭圆曲线),则ServerKeyExchange
格式当然是不同的。
请参阅标准以了解ServerKeyExchange
消息的定义。对于DHE密码套件,按顺序包含模数p,生成器g和服务器DH公钥y,它们分别以上述格式表示为一个大整数(16位标头包含字节长度,然后是整数)。无符号big-endian编码的值)。
最近的OpenSSL版本倾向于选择一个DH模量大小匹配(从安全的角度来看)服务器的密钥对的强度(用于签名的ServerKeyExchange
消息)。在上面的示例中,服务器具有2048位RSA密钥,因此OpenSSL选择使用2048位DH模数(在这种情况下,是RFC 3526第3节中介绍的众所周知的模数)。
其他一些服务器则坚持使用1024位DH组,以确保与不支持较大DH组的某些现有客户端兼容(最大的冒犯者是Java中的SSL实现,2012年在Java 8 build 56中进行了修复)。对于DHE密码套件,TLS协议中的一个已知缺陷是,客户端无法指定其可以支持的模数大小(这对于ECDHE是固定的,因为客户端可以指定其接受的确切曲线列表) 。
ServerKeyExchange
有0c 00 03 0b
。您可以提供确切的命令来获取输出吗?我没有任何握手开始于0c
如果您拥有PEM格式的证书,则可以尝试使用此命令,它将为您提供来自Openssl命令的正确输出。
openssl dhparam-通知PEM -in ./imapd.pem -check -text (样本输出) PKCS#3 DH参数:(512位) 主要: xx:xx:xx:xx xx:xx:xx:xx xx:xx:xx:xx 产生器:2(0x2) DH参数似乎正常。 ----- BEGIN DH参数----- XXXX XXXX -----结束DH参数-----
希望这是您想要的。
s_client
始终在“握手已读取x并写入y”之前(适用时)始终显示“ Temp服务器密钥” DH&size或ECDH&curve。对其进行解码。自动选择DHE 的是最近的Apache mod_ssl:httpd.apache.org/docs/trunk/mod/mod_ssl.html#sslcertificatefile(记录有关Java客户端的问题)。