Java虚拟机热点ephemeralDHKeySize

4

我正试图将DH密钥大小从1024位增加到2048位,根据这个问题:如何在Java 8中扩展DH密钥大小到2048

但是,似乎并没有起作用。相关信息:

java -version
java version "1.8.0_45" 
Java(TM) SE Runtime Environment (build 1.8.0_45-b14) 
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)

并且
System.out.println(Security.getProperty("jdk.tls.ephemeralDHKeySize"));
2048

然而,如果我从客户端连接到该服务器,它将使用1024位:

openssl s_client -connect server:port -cipher "EDH" 2>/dev/null | grep -ie "Server .* key"
Server Temp Key: DH, 1024 bits

你还有其他的想法吗?


只是一种猜测:也许密钥大小受到安全策略的限制?您尝试安装无限强度策略了吗?http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html - Cybran
你在哪个平台上运行?你使用哪个版本的openssl进行连接?(openssl version会告诉你) - Pete Clark
红帽6平台,检查openssl版本,我认为是1.0.2g。 - Michael
@DevCybran,是的,无限强度策略已安装。 - Michael
1
@PeteClark 这个输出意味着openssl 1.0.2或更高版本(目前只有1.1.0-alpha或head); openssl至少从2002年的0.9.7开始支持DH大小为65536。 (而且在FIPS186-3标准化> 1024之前,也可以使用某种程度的DSA,但存在不方便的限制:它无法生成具有大于160的子组的参数,因此您必须手动完成,并且EVP API和命令行无法使用除SHA1以外的哈希进行签名/验证,因此您必须使用低级API。)正如您的答案所说,问题在于它是系统属性。 - dave_thompson_085
显示剩余2条评论
1个回答

1

我担心你正在调用Security.getProperty("jdk.tls.ephemeralDHKeySize")来检查DH密钥的大小。 jdk.tls.ephemeralDHKeySize属性不是Security属性,而是System属性,这让我怀疑你没有正确设置它。如果你是这样设置的:

Security.setProperty("jdk.tls.ephemeralDHKeySize", "2048"); // don't do this

那样是行不通的。尝试传递以下内容之一:
-Djdk.tls.ephemeralDHKeySize=2048

在您的程序命令行中设置,或者像这样设置:
System.setProperty("jdk.tls.ephemeralDHKeySize", "2048");

在代码中。

3
如果你在代码中设置某个属性,请确保它在第一个SSL操作之前被设置——在 sun.security.ssl.ServerHandshaker 类加载之前,因为该属性会被检查并缓存。 - dave_thompson_085
@Pete Clark,嗯,有趣。实际上我没有在代码中设置它,而是在“java.security”文件中设置的,该文件可以在JavaHome/jre/lib/security中找到。然后,如果我执行'System.getProperty',它会找不到该值(null)。只有当我执行'Security.getProperty'时才能找到它。所以你认为通过java.security文件设置它是不正确的? - Michael
@Pete Clark,问题已解决!使用命令传递 -Djdk 等参数可以解决问题。你有没有想过为什么java.security属性不起作用?我认为这些设置应该适用于整个JVM,这样我就不必为在JVM内运行的每个进程分别设置它们了。 - Michael
@Michael - 对不起 - 我不知道。我通常不愿意更改 jre 文件夹中的内容,因为这并不能保证在 JRE 或 JDK 更新时会被保存,并且可能导致部署后的不良结果。 - Pete Clark

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