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

10

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

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

预计时间:如果我只使用临时 DH 密码套件,即名称中带有 DHE 或 ECDHE 而不是 DH 或 ECDH 的密码套件,那么我会安全吗?或者这与此无关?


Logjam仅适用于短暂整数DH,其中服务器使用弱参数,因为出口被伪造(DHE_EXPORT),或者使用“正常”的DHE,但服务器配置/编码愚蠢(论文第3.5节)。如果您可以获得DH的证书,并且CA允许愚蠢的弱参数,那么它将适用于静态整数DH,但实际上您无法这样做。它也不适用于ECDH,无论是短暂的还是静态的,该论文建议一般使用ECDHE作为修复方法,但特别提到了目前常见的SECG / NIST曲线的怀疑。 - dave_thompson_085
1
主要是弱点(512位,可能768位或1024位)使攻击成为可能。共享只会使攻击更具成本效益,因为您可以在一个“输入”中获得更多的“输出”。如果生成的2048位密钥是可验证的(这样您就可以确信它确实具有2048位的强度),那么共享2048位密钥将是可以接受的。 - dave_thompson_085
1
@dave_thompson_085 而且我们无法知道 sun.security.provider.ParameterCache 中共享的 2048 位参数是否安全? - danarmak
实际上,生成过程在代码注释中有记录。@danarmak - eckes
1个回答

7

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密钥的大小

作为TLS客户端的Java在旧版中不太严格,接受不安全的组。

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


1
谢谢。Logjam 报告建议至少使用 2048 位 DH 组,所以我想我必须研究使用 BC 提供者来操作它,因为 Java 可能无法受到影响。 - danarmak
2
实际上,Logjam报告表示,如果生成而不是共享/标准的,则1024位DH质数是安全的。因此,我想Java 8(服务器)现在是安全的。 Java 8客户端可能不安全。 - danarmak
我添加了将其增加到2048位的选项。 - eckes
2
使用“标准”提供程序SunJCE,JSSE服务器使用sun.security.provider.ParameterCache中的硬编码参数集之一,而不是新生成的参数集。过去我无法让JSSE与BC作为原始提供程序配合使用,尽管最近我还没有重新尝试。在所有版本中,JSSE服务器选择DH-512用于导出套件(根据RFC),否则7 或6使用768,8按您指示工作(默认1024,可配置高达2048或768)。 - dave_thompson_085
1
总之,Java 8服务器可以使用2048位DH密钥,但通常使用共享参数,除非我们可以替换BC实现。或者,我们可以通过反射将新的参数注入到“sun.security.provider.ParameterCache”中。 - danarmak
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接