如何在Java SSLEngine中设置自定义DH组以防止Logjam攻击?

对TLS的新Logjam攻击基于常见的DH组。 此链接建议为每个服务器生成一个新的自定义2048位DH组。

如何在使用SSLEngine的Java服务器代码中设置自定义DH组?

ETA:如果我只使用短暂的DH密码套件,即使用DHE或ECDHE而不使用DH或ECDH的密码套件,我会安全吗? 或者这是无关的?

Java(JCE / JSSE)使用来自一些众所周知的DSA组的 DH参数。 JCE参数生成器仅允许生成大小介于512和1024位(或2048)之间的组,但另一方的JSSE实现仅接受1024和2048之间的自定义大小。

这有影响你不能使用任何自定义大小,只有1024或2048(使用Java 8)。 请记住,Java 7仍然只使用768位作为服务器(或512可导出加密模式)。

从版本8开始Java服务器默认使用1024位。 您可以使用jdk.tls.ephemeralDHKeySize=2048将服务器端增加到2048位。 请参阅自定义临时DH密钥的大小 。

Java作为TLS客户端在旧版本中不那么严格,并且接受不安全的组。

更新:使用OpenJDK 8U65(JSSE),有一个安全属性jdk.tls.server.defaultDHEParameters ,可以定义jdk.tls.server.defaultDHEParameters -field参数。