ssl - Java 7 和无法生成 DH key 对

标签 ssl java jce

我读过一篇关于当服务器发送超过 1024 位的 key 时引发错误“无法生成 DH key 对”的帖子。下载 JCE unlimited jar 应该可以解决这个问题。在测试环境中,我遇到了以下问题,对于同一个 Web 服务器,如果我使用 Java 6,则在执行 https 查询时不会出现任何错误,但如果我使用 Java 7,则会出现“无法生成 DH key 对”。

我尝试为 JCE unlimited 替换 jar 文件,但仍然遇到相同的错误。自 2007 年以来就报告了该错误,但为什么它在 Java 6 而不是 Java 7 上运行?是下载的文件不对吗?我从之前的帖子中获得了链接 Java: Why does SSL handshake give 'Could not generate DH keypair' exception? .

此时我不知道该怎么办。如果我尝试加载 BouncyCaSTLe 提供程序,我会收到 ArrayOutOfIndex 异常。我的服务器只允许 DH 算法,所以我不能使用上面帖子中建议的其他算法。

最佳答案

一些补充或说明:

(Suncle) 自 7u09 起的 Java 7 默认使用更合理的一致密码套件顺序,这与 7u04 中看似随机的顺序不同。 (我没有在 04 和 09 之间进行测试。)此顺序将 ECDHE 和普通 RSA(又名 akRSA)放在 DHE 之前,因此当且仅当服务器支持 ECDHE 或 RSA 并同意客户端偏好时,才能避免问题。 (或 ECDH-fixed,但实际上没有人使用它。)如果服务器坚持使用 DHE(无论出于何种原因)并使用 DH>1024 位,您仍然会遇到问题。

如果提问者(或其他任何人)连接到真正需要整数 DH(而不是 ECDH 或 RSA)的服务器,则在 8 之前使用 Java 的唯一方法是让服务器使用 DH 1024 位。哪个 AFAWK 在技术上还可以安全使用几年,但由于微乎其微,它被 NIST 等重要权威机构禁止(请参阅 csrc.nist.gov 上的 Special Pub 800-57)。 (甚至 RSA 1024 还没有真正破解,但它可能很快就会被禁止。)

“无限力量政策”与这个问题无关,或者至少不是直接相关,#6851461 的好答案并没有说是。它不会更改 SunJCE 中对 DH 参数的限制,这被(错误地)视为标准问题而不是强度问题。 (具体来说,它采用了过去对 DSA 正确的限制,并将它们应用于 DH。)它确实启用了 AES-256 和 SHA-2(仅适用于 TLSv1.2)套件,并且给出了一个足够奇怪的首选项列表,这可能将选择结果从 DHE(失败)更改为非 DHE(有效)。

您不需要完全回到 Java 6 列表,您只需要优先考虑其他 key 交换而不是 DHE,或者对于顽固的服务器完全放弃 DHE。您绝对不应该重新启用任何 EXPORT 或单 DES 套件,除非遗留服务器绝对需要;它们现在已经不安全了好几年了,并且在 6 年内保持默认启用状态的时间比它们应有的时间长得多。

关于ssl - Java 7 和无法生成 DH key 对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10687200/

相关文章:

ssl - 如何在树莓派上验证 openssl 证书?

java - 如何反序列化 EnumMap

java - 无法发现这段代码的问题

Java Create KeyPair 在虚拟机上挂起,但在物理系统上工作

java - 错误 : package com. 升级到 Java 1.6 后 sun.crypto.provider 不存在

java - cxf 2way ssl not webservice give 无法创建安全的 XMLInputFactory

java - Java 和 HTTPS 的问题

java - 如何使用 Camel 的 JettyHttpComponent 配置包含的协议(protocol)?

java - 如何计算S3文件内容的SHA-256校验和

Java 1.7 + JSCH : java. security.InvalidKeyException: Key is too long for this algorithm