OpenSSL:显示DH参数


15

当使用依赖于差异地狱人密钥交换的SSL密码时,所用私钥的大小对于该密钥交换的安全性至关重要。

当我使用“ openssl s_client”工具连接到服务器时,如何查询所用的DH参数?

Answers:


17

我不知道易于使用的命令行开关,但是在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字节。
  • 第一个元素是DH模量,它是一个大整数,带有两个字节的标头。此处,长度编码为01 00,表示在0x0100字节上编码的整数。这是256个字节,因此模数的长度在2041和2048位之间。
  • 模数字节以无符号big-endian顺序排列。在这种情况下,该模数的最高字节为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是固定的,因为客户端可以指定其接受的确切曲线列表) 。


1
OpenSSL不会自动选择DHE,但应用程序回调可以。OpenSSL 1.0.2(2015年1月)可以选择自动选择ECDHE,并且在1.0.2中s_client始终在“握手已读取x并写入y”之前(适用时)始终显示“ Temp服务器密钥” DH&size或ECDH&curve。对其进行解码。自动选择DHE 的是最近的Apache mod_sslhttpd.apache.org/docs/trunk/mod/mod_ssl.html#sslcertificatefile(记录有关Java客户端的问题)。
dave_thompson_085

我使用OpenSSL的1.0.1e,我没有得到任何ServerKeyExchange0c 00 03 0b。您可以提供确切的命令来获取输出吗?我没有任何握手开始于0c
rubo77 2015年

如果服务器选择的密码套件不是“ DHE”或“ ECHDE”密码套件,则将没有ServerKeyExchange消息。
Thomas Pornin 2015年

我得到<<< TLS 1.2握手[length 01cd],ServerKeyExchange 0c 00 01 c9 03 00 17 41 04 08 5f 82 88 1e e5 b6,后跟443个八位字节,对应于从第五个八位字节开始的长度0x1c9。但是,“ 0300”似乎表示768个八位位组,而我确信我的DH参数“仅为” 204​​8位。
Law29 2016年

1
@ Law29这看起来更像ECDHE ServerKeyExchange。如果使用椭圆曲线,则“ 03”表示“这是一条命名曲线,接下来的两个字节编码曲线标识符”。然后,“ 00 17”是曲线标识符,它是NIST P-256(ECDHE使用最多的曲线)。然后,“ 41”是公共点长度,正好是未压缩格式的P-256点的正确值;这样的一点将从值0x04的字节开始,而这正是您所拥有的。总结:似乎您的TLS 1.2握手确实使用了ECDHE,而不是DHE。
Thomas Pornin '16

9

如果您拥有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参数-----

希望这是您想要的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.