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

dan*_*mak 10 java ssl sslengine

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

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

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

eck*_*kes 7

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

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

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

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

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

  • 实际上,Logjam报告称,如果生成1024位DH素数并且不是共享/标准素数,则它们是安全的.所以我猜Java 8(服务器)现在是安全的.Java 8客户端可能不是. (2认同)
  • 使用"标准"提供程序SunJCE,JSSE服务器使用`sun.security.provider.ParameterCache`中的一个硬编码参数集,而不是新生成的参数集.在过去,我无法让JSSE与BC一起工作作为原始提供者,尽管我最近没有重试过.在所有版本中,JSSE服务器为导出套件选择DH-512(根据RFC),否则7*或6*使用768和8工作,如您所示(默认1024,可配置为2048或768). (2认同)