您的(一些重叠的)选项是:

您的(一些重叠的)选项是:

我们不是专家,尝试更新我们的 Web 服务器 (JBoss-5.1.0.GA) 设置以符合 Diffie-Hellman 标准,但目前尚未成功。在https://weakdh.org/sysadmin.html,我们被告知需要“生成新的 2048 位 Diffie-Hellman 参数”。过去,我们曾使用 Java keytool 生成密钥,但我们无法找到有关使用 Java keytool 生成新的 2048 位 Diffie-Hellman 参数的任何信息。有谁知道如何做到这一点或可以为我们指明正确的方向吗?谢谢!

答案1

您不能使用 keytool 来执行此操作。首先,keytool它根本不支持 DH。其次,keytool它不会为任何算法生成参数,只生成私钥/密钥对。第三,当keytool生成密钥对时,它还会生成自签名证书(有时随后被“真正的” CA 颁发的证书取代),并且不可能为 DH 生成自签名证书,因为 DH 不签名。您可以编写一个非常简单的(大约 10 行)Java 程序来生成 DH 参数。但它可能对你没有任何帮助,因为:

无论如何,Java 在这里不接受 DHE 参数。JbossWS(Jboss 网络服务器,后来更名为 Wildfly)是 Tomcat 的一个分支,通常使用 Java 实现的 SSL/TLS,即 JSSE。在 Java 7 之前,JSSE 使用自己的 DHE 参数,这些参数是 768 位的,这太弱了。(除了 EXPORT 套件,JSSE 遵守 RFC 对 DH-512 的要求,这完全是错误的,但 EXPORT 套件在设计上是完全错误的,在 Java 7 以上版本中默认禁用。)Java 8 JSSE 允许您控制尺寸DHE 参数,但不是实际值。

您的(一些重叠的)选项是:

使用 Java 8。Java 8 中的 JSSE(而不是更早版本)将 DHE 默认为 1024 位,大多数权威机构认为这已经足够强大了,尽管weakdh.org 并不这么认为,并且允许您指定更多,请参阅https://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html#customizing_dh_keys以及背景https://stackoverflow.com/questions/30352105/how-to-set-custom-dh-group-in-java-sslengine-to-prevent-logjam-attack。请注意,如果您有任何 Java客户在 Java 8 之前,它们将失败如果服务器使用超过 1024 位的 DHE。我不知道有其他客户端有这个问题,但在进行此更改之前请先测试一下您的客户端。

启用 ECDHE。Java 7 及更高版本中的 JSSE 实现了 ECDHE,它不像 DHE 那样需要预计算,(通常)使用 P-256,这已经足够强大了。(尽管有些人不相信任何NIST ECC 曲线,因为 NIST 总体上受到 NSA 的影响,尽管据我所知没有开源显示 ECC 曲线存在问题。)Java 6 实际上有 ECDHE 的 JSSE 部分,但只有当 JVM 具有用于 ECC 原语的加密“提供程序”时才会启用,而 Java 6 没有。bcprov-*-jdk15on 来自http://www.bouncycastle.org/是一系列 Java 加密原语(包括 ECC)的 JCE 提供程序,因此如果您将 jar 添加到您的JRE/lib/ext列表org.bouncycastle.jce.provider.BouncyCastleProviderJRE/lib/security/java.security(或在代码的早期某处执行适当的操作Security.add/insertProvider()),Java 6 可以执行 ECDHE。当然,您是否应该仍在使用任何 Java 6 本身就是一个问题。

几年前,浏览器和其他客户端对 ECDHE 的支持还不太稳定,但据我所知,现在所有最新的浏览器都支持它,并且更喜欢将其转换为 DHE——也就是说,浏览器 hello 在 DHE 套件之前列出 ECDHE 套件,因此如果服务器同时实现两者,它应该选择 ECDHE。非浏览器客户端可能不会;请进行测试以确定。

禁用 DHE。您可以在 Connector 属性中配置密码列表以排除 DHE 密码;同时,还可以排除无用的 staticDH 和 staticECDH,以及(单个)DES 和(所有)“EXPORT”(如果存在)(Java 6)。这意味着不执行 ECHDE 的浏览器和客户端将只能使用纯 RSA,并且没有前向保密,但至少它们具有“当前”保密性。我记不清了,但我认为 5.1 Connector 配置仍然在某个地方$server/deploy/jbossweb/server.xml

尝试一下原生的。Tomcat(正如我所说,JbossWS 就是从 Tomcat 开始的)有一个选项,可以使用“本机”(又名“APR”)实现 HTTPS(SSL/TLS),它实际上是 OpenSSL 而不是 JSSE。我在 JbossWS 上使用此选项时,取得了不同的成功,并且不记得 5.1 是否成功过。如果你的 JbossWS 有一个可行的 TC 原生选项,并且如果它可以处理配置 DH 参数,然后使用 openssl 生成 DH 参数和 JbossWS-native 指令来配置它们。

答案2

实际上您可以指定自定义 DHE 参数使用最新的 Java 8 版本。这与应用程序无关(只要它使用 JSSE TLS 实现)。

首先需要指定要使用的 DHE 密钥的大小(-Djdk.tls.ephemeralDHKeySize=1024-Djdk.tls.ephemeralDHKeySize=2048)。在服务器上,这将使用 DHE 的预定义生成器/素数组合。对于 Java 8,只能使用 1024 或 2048,JDK 9 将支持更大的尺寸

如果您想提供不同的组合,您可以在 jre/lib/security/Java.security 中使用jdk.tls.server.defaultDHEParameterssecurity 属性指定它们(自 8u51 起)。它需要一个参数列表(每个使用的密钥大小一个),并且必须包含素数和生成器(通常为 2 或 5)作为十六进制。

如果您曾经openssl dhparam -out dhparam2048.pem 2048生成过新的对,则可以使用openssl dhparam -noout -text -check -in dhparam2048.pem它在文本模式下读取和打印该文件。您必须将文本复制并粘贴到 Java 安全属性中(使用tr -d ':'删除:openssl 十六进制表示之间的)

以下是一个示例(仅限 1024 至 1024):

>openssl dhparam -in p -check -text -noout | tr -d ':'
PKCS#3 DH Parameters: (1024 bit)
    prime:
       00f7a63b59edcc43a43df12077f0e9
        14129c20a73cef95f919896e608ebc
        8722776c948765bbbf61542e118329
        6c6ea74ecbded3a93aff77a062aba4
        fcf04fc01030e65077f5a802605058
        65b836368dd5ea389d77691fac0f2c
        f7a161c51c8e97ddecb3cf7f872b0c
        cfaf54373d5203edcabc575e871bb1
        107ec2f30c78ebf403
    generator: 2 (0x2)
DH parameters appear to be ok.

这导致

jdk.tls.server.defaultDHEParameters= \
    { \
        00f7a63b59edcc43a43df12077f0e9 \
        14129c20a73cef95f919896e608ebc \
        8722776c948765bbbf61542e118329 \
        6c6ea74ecbded3a93aff77a062aba4 \
        fcf04fc01030e65077f5a802605058 \
        65b836368dd5ea389d77691fac0f2c \
        f7a161c51c8e97ddecb3cf7f872b0c \
        cfaf54373d5203edcabc575e871bb1 \
        107ec2f30c78ebf403, 2 }

您应该重新启动服务器并验证它是否实际使用此素数(而不是默认素数),因为该过程并不直接,因此可能会出现很多问题。默认定义为在源代码中,对于 2048 位,素数来自 TLS FFDHE 草案。

例如,当运行 openssl s_client 时,我可以看到 1024 位素数(ffffff ffffffffffc90f...5381ffffffffffffffff)连接到 Java 8 JSSE 服务器时:

>openssl s_client -msg -cipher DHE-RSA-AES128-SHA256 -connect localhost:1234
...
<<< TLS 1.2 Handshake [length 018f], ServerKeyExchange
0c 00 01 8b 00 80 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
08 79 8e 34 04 dd ef 95 19 b3 cd 3a 43 1b 30 2b
0a 6d f2 5f 14 37 4f e1 35 6d 6d 51 c2 45 e4 85
b5 76 62 5e 7e c6 f4 4c 42 e9 a6 37 ed 6b 0b ff
5c b6 f4 06 b7 ed ee 38 6b fb 5a 89 9f a5 ae 9f
24 11 7c 4b 1f e6 49 28 66 51 ec e6 53 81 ff ff
ff ff ff ff ff ff 00 01 02 ...

相反,您必须在安装时看到您的自定义参数。

Java 7(768 位)的默认参数为“e9e642...7a3daf”,带有一个长生成器“30470ad..529252”定义在 ParameterCache 中

答案3

我也遇到过同样的问题,但是是来自 Glassfish。

首先,我建议(如果可以的话)在 JBoss 服务器前面放置某种反向代理,因为它将删除密码/证书安全性与您正在运行的 Java 版本之间的链接。

要获得大于 768 位的 Ephemeral DH 密钥长度,您需要在 Java 8 上运行。1024 是新的默认值,您可以使用jdk.tls.ephemeralDHKeySize(详细信息:) 将其增加到 2048自定义 DH 密钥)。据我所知,Java中没有单独重新生成密钥参数的概念。

相关内容