所以这是我的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这样的强曲线?
答案 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)
我有同样的问题。以下是我的发现,只能部分解决问题:
com.sun.security.ssl.HelloExtension
(列出所有扩展名)和com.sun.security.ssl.SupportedEllipticCurves
(这是提供允许曲线列表的椭圆曲线扩展名)中实现了这些扩展名。暂时忽略OpenJDK(GPLv2 + Classpath异常)和Oracle JDK(此处为:Java环境二进制许可证)的许可证,这是从技术上解决问题的一种方法:
com.sun.security.ssl.SupportedEllipticCurves
com.sun.ec.CurveDB.java
)Xbootclasspath:prepend
使用修改后的曲线列表加载您的类,并忽略JVM。而且还有许可证问题......
例如,jetty-alpn-agent正在这样做。它也被置于GPLv2 +异常之下。我不是律师,但我认为你可以创建一个开源项目,做你的事情,把它放在GPLv2 +扩展下,然后就可以使用它。