“无法生成 DH 密钥对”异常故障排除
尝试与某些 IRC 服务器(特别是光圈.esper.net)建立 SSL 连接时: 6697),Java可能会遇到“java.lang.RuntimeException: Could not generated DH keypair”异常,并伴有通过随后的“java.security.InvalidAlgorithmParameterException:质数大小必须是 64 的倍数,并且范围只能从 512 到 1024(含)”。
原因:
此异常源于 Java 接受 DH 密钥对的默认最大素数大小,即 1024 位。但是,启动 SSL 连接的服务器(在本例中为 aperture.esper.net)可能会尝试协商具有较大素数大小的 DH 密钥对。
解决方法:
1。使用 BouncyCastle 的 JCE 实现:
根据 JDK-6521495 错误报告中的建议,您可以利用 BouncyCastle JCE 实现来替换默认的 Java 实现。此替代实现支持更大的 DH 密钥对大小。
2.升级 Java 版本:
此问题已在最新的 Java 版本中得到解决。最大素数大小限制在 JDK 7044060 中提高到 2048 位,并在 JDK 8072452 中完全删除(允许大小超过 2048 位)。升级到 Java 9 或更高版本将解决该问题。
示例 (使用BouncyCastle):
Security.addProvider(new BouncyCastleProvider()); SSLContext sslContext = SSLContext.getInstance("SSL", "BC"); sslContext.init(null, trustAllCerts, new SecureRandom()); s = (SSLSocket)sslContext.getSocketFactory().createSocket(); s.connect(new InetSocketAddress(host, port), timeout); s.setSoTimeout(0); ((SSLSocket)s).startHandshake();
附加说明:
虽然有问题的服务器,aperture.esper.net,从标准角度来看似乎配置错误,上述解决方案将允许您的 Java 应用程序成功连接并建立 SSL 会话。
以上是如何修复 Java SSL 连接中的'无法生成 DH 密钥对”异常?的详细内容。更多信息请关注PHP中文网其他相关文章!