OpenSSL:显示 DH 参数

OpenSSL:显示 DH 参数

当使用依赖于 Diffie-Hellman 密钥交换的 SSL 密码时,所采用的私钥的大小对于该密钥交换的安全性至关重要。

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

答案1

我不知道有什么好用的命令行开关,但在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 位之间。
  • 接下来是模数字节,按无符号大端顺序排列。本例中,该模数的顶部字节为ff ff ff ff...。模数的长度恰好为 2048 位。

如果您使用 ECDHE 密码套件(椭圆曲线),那么ServerKeyExchange格式当然会有所不同。

标准用于消息的定义ServerKeyExchange。对于 DHE 密码套件,它包含模数, 发电机G以及服务器 DH 公钥,按该顺序,每个都表示为上面描述的格式的大整数(包含字节长度的 16 位标头,然后是无符号大端编码的整数值)。

最近的 OpenSSL 版本倾向于选择与服务器密钥对强度相匹配的 DH 模数大小(从安全角度来看)(用于符号消息ServerKeyExchange)。在上面的例子中,服务器有一个 2048 位 RSA 密钥,因此 OpenSSL 选择使用 2048 位 DH 模数(在本例中,是众所周知的模数,在RFC 3526,第 3 节)。

一些其他服务器坚持使用 1024 位 DH 组,以确保与一些不支持更大 DH 组的现有客户端兼容(最大的问题是 Java 中的 SSL 实现,已修复在 Java 8 版本 56 中2012 年)。对于 DHE 密码套件,TLS 协议的一个已知缺陷是客户端无法指定其可能支持的模数大小(对于 ECDHE,此问题已得到修复,因为客户端可以指定其接受的曲线的确切列表)。

答案2

如果您有 PEM 格式的证书,您可以尝试此命令,它应该为您提供来自 Openssl 命令的正确输出。

openssl dhparam -inform 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 参数看上去没问题。
-----开始 DH 参数-----
XXX
XXX
-----结束 DH 参数-----

希望这就是您所寻找的。

答案3

David Loh 的回答对我来说没用。它需要DH PARAMETERS,但我不知道从哪里获取它们。

Thomas Pornin 的回答很有帮助,但我必须强制使用 TLS 1.2 才能看到ServerKeyExchange(例如openssl s_client -connect example.org:443 -msg -tls1_2),即便如此,我也不太确定我是否正确地解释了输出。

我找到了另一个更能满足我需要的工具:sslyze

安装方法:

pip install sslyze

示例输出:

$ python -m sslyze example.org | grep -iw dh
        TLS_DHE_RSA_WITH_AES_256_GCM_SHA384               256       DH (1024 bits) 
        TLS_DHE_RSA_WITH_AES_256_CBC_SHA256               256       DH (1024 bits) 
        TLS_DHE_RSA_WITH_AES_128_GCM_SHA256               128       DH (1024 bits) 
        TLS_DHE_RSA_WITH_AES_128_CBC_SHA256               128       DH (1024 bits) 
        * dh_param_size: DH parameter size is 1024, should be superior or equal to 2048.

相关内容