【问题标题】:Java SSL Server disable weak elliptic curvesJava SSL Server 禁用弱椭圆曲线
【发布时间】:2016-10-04 17:53:21
【问题描述】:

这是我的 Java ssl 服务器的代码。 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, 21,31, sect283k1, sect283k1, sect283k1, sect283k1, sectkr4 sect409r1, sect571k1, sect571r1, secp160k1, secp160r1, secp160r2, secp192k1, prime192v1, secp224k1, secp224r1, secp256k1, prime256v1, secp384r1, secp521r1)。

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

【问题讨论】:

    标签: java security ssl server


    【解决方案1】:

    从 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 的默认强度”

    【讨论】:

      【解决方案2】:

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

      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 年?

      暂时忽略 OpenJDK(GPLv2+Classpath 例外)和 Oracle JDK(此处:Java 环境二进制许可证)的许可证,这是一种技术上解决问题的方法:

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

      还有许可证问题...

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-14
        • 2018-05-20
        • 1970-01-01
        相关资源
        最近更新 更多