gpt4 book ai didi

java - 有什么方法可以使用 javax.net.ssl.SSLServerSocket 指定 Diffie-Hellman 素数的范围吗?

转载 作者:太空宇宙 更新时间:2023-11-03 14:55:51 28 4
gpt4 key购买 nike

我正在尝试重现 Java: Why does SSL handshake give 'Could not generate DH keypair' exception? 中提出的问题.

我有一个日志显示异常原因:

Caused by: javax.net.ssl.SSLException: java.lang.RuntimeException: Could not generate DH keypair
at sun.security.ssl.Alerts.getSSLException(Alerts.java:208)
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1886)
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1844)
at sun.security.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java:1827)
at sun.security.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java:1753)
at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:127)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
at org.apache.axis2.transport.http.AxisRequestEntity.writeRequest(AxisRequestEntity.java:94)
... 27 more
Caused by: java.lang.RuntimeException: Could not generate DH keypair
at sun.security.ssl.DHCrypt.<init>(DHCrypt.java:136)
at sun.security.ssl.ClientHandshaker.serverKeyExchange(ClientHandshaker.java:621)
at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:205)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:868)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:804)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1016)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)
at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:702)
at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:122)
... 30 more
Caused by: java.security.InvalidAlgorithmParameterException: Prime size must be multiple of 64, and can only range from 512 to 1024 (inclusive)
at com.sun.crypto.provider.DHKeyPairGenerator.initialize(DHKeyPairGenerator.java:120)
at java.security.KeyPairGenerator$Delegate.initialize(KeyPairGenerator.java:658)
at sun.security.ssl.DHCrypt.<init>(DHCrypt.java:127)
... 38 more

我正在使用 Axis2 调用 Web 服务。我在 jre/lib/security 中也有“Java 加密扩展 (JCE) 无限强度管辖策略文件”(但正如其他帖子中提到的那样,这对他们不起作用)。

为了重现此问题,我尝试在具有类似环境(也使用 Axis2)的单独部署中托管 Web 服务。这有一个自定义的 SSLServerSocketFactory,它正在创建和配置 SSLServerSocket。

使用 Wireshark(以及 javax.net.debug JVM 参数)我可以看到协商的密码套件是 TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA 但 ServerKeyExchange 中的 Prime DH 服务器参数只有 96 字节(768 位)。

有什么方法可以将 SSLServerSocket 配置为在握手期间使用更大的素数?

我猜 key 是由 JRE 的 RSA 安全提供程序生成的。我是否需要添加自己的提供程序并将其添加到 jre/lib/security/java.security?

抱歉,如果这是一个愚蠢的问题,我一般是 DHE 和密码套件的新手。我只需要知道足够多的知识就可以让服务器测试正常工作(我不涉及客户端实现)。

最佳答案

因此,在 EJP 向正确方向的插入下,我最终成功地找到了确定强度(以及随后的 DH 参数)的确切位置。它确实在 JRE 中(特别是在 ServerHandshaker 中)。

将安全提供程序与具有强度限制(如原始帖子中所述)的旧 JRE 一起使用在这里不起作用。虽然使用其他安全提供程序可能会在客户端防止此错误,但在初始化 KeyPairGenerator 的实现之前已经确定了强度。

作为旁注,我没有费心升级 JRE 来重现这一点。我刚刚添加了带有调试信息的 BouncyCaSTLe JCE 提供程序,在 org.bouncycaSTLe.jcajce.provider.asymmetric.dh.KeyPairGeneratorSpi.initialize(int, SecureRandom) 方法中放置了一个断点并手动更改了强度。这对我的测试来说已经足够好了。

关于java - 有什么方法可以使用 javax.net.ssl.SSLServerSocket 指定 Diffie-Hellman 素数的范围吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29483924/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com