Java SSL Server禁用弱椭圆曲线

时间:2016-06-04 21:21:21

标签: java security ssl server

所以这是我的Java ssl Server的代码。 ctx是使用服务器密钥库初始化的SSLContext

public SSLEngine createSSLEngine() {

        SSLEngine sslEngine = ctx.createSSLEngine();

        String[] ciphersuites = new String[]{
                "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384",
                "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384",
                "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
                "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
                "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",
                "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
                "TLS_EMPTY_RENEGOTIATION_INFO_SCSV"
        };

        sslEngine.setEnabledCipherSuites(ciphersuites);

        sslEngine.setUseClientMode(false);

        return sslEngine;
    }

我用cipherscan(https://github.com/jvehent/cipherscan)测试了它,密码套看起来很好,但是服务器支持所有可能的椭圆曲线(sect163k1,sect163r1,sect163r2,sect193r1,sect193r2,sect233k1,sect233r1,sect239k1,sect283k1,sect283r1, sect409k1,sect409r1,sect571k1,sect571r1,secp160k1,secp160r1,secp160r2,secp192k1,prime192v1,secp224k1,secp224r1,secp256k1,prime256v1,secp384r1,secp521r1)。

有没有办法禁用所有曲线,除了像secp384r1这样的强曲线?

2 个答案:

答案 0 :(得分:6)

从Java8 u121开始,可以配置要使用的椭圆曲线。

在程序的VM启动时使用参数,例如:

-Djdk.tls.namedGroups="secp521r1, secp256r1, secp256k1"

或者,如果您想要一个JDK / JRE宽策略更改java.security文件并添加该属性。即:

-jdk.tls.namedGroups="secp521r1, secp256r1, secp256k1"

作为参考,请参阅:http://www.oracle.com/technetwork/java/javase/8u121-relnotes-3315208.html段落“提高JDK中EC的默认强度”

答案 1 :(得分:0)

我有同样的问题。以下是我的发现,只能部分解决问题:

  1. 带椭圆曲线的TLS基于RFC 3546(TLS扩展)和RFC 4492(椭圆曲线的TLS扩展)
  2. Java在com.sun.security.ssl.HelloExtension(列出所有扩展名)和com.sun.security.ssl.SupportedEllipticCurves(这是提供允许曲线列表的椭圆曲线扩展名)中实现了这些扩展名。
  3. 遗憾的是,这些类包含在JVM中,似乎没有办法只使用参数修改列表。 :(
  4. 我读了一个错误修正报告,该报告应包含在Java 9.1中,其中可能包含配置功能。那么2018年,我猜?
  5. 暂时忽略OpenJDK(GPLv2 + Classpath异常)和Oracle JDK(此处为:Java环境二进制许可证)的许可证,这是从技术上解决问题的一种方法:

    1. 从OpenJDK获取代码,例如班级com.sun.security.ssl.SupportedEllipticCurves
    2. 相应地修改它(曲线ID列表可以在com.sun.ec.CurveDB.java
    3. 中找到
    4. 编译一个jar
    5. 使用Xbootclasspath:prepend使用修改后的曲线列表加载您的类,并忽略JVM。
    6. 而且还有许可证问题......

      例如,jetty-alpn-agent正在这样做。它也被置于GPLv2 +异常之下。我不是律师,但我认为你可以创建一个开源项目,做你的事情,把它放在GPLv2 +扩展下,然后就可以使用它。