无法从代理服务器生成DH密钥对

时间:2014-05-09 07:33:41

标签: java ssl

通过具有java版本1.6.0_26的代理服务器访问第三方URL时出现以下错误。

 java.lang.RuntimeException: Could not generate DH keypair
        at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:190)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1649)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1612)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java:1595)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java:1521)
        at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:64)
        at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
        at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
        at org.owasp.webscarab.model.Request.writeDirect(Request.java:234)
        at org.owasp.webscarab.model.Request.writeDirect(Request.java:215)
        at org.owasp.webscarab.httpclient.URLFetcher.fetchResponse(URLFetcher.java:251)
        at org.owasp.webscarab.plugin.proxy.ConnectionHandler.run(ConnectionHandler.java:346)
        at java.lang.Thread.run(Thread.java:662)

我搜索过并发现这可能是由于Open JDK 1.6不支持> 1024位加密。因此,当我们从http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html

替换JCE修补的jar时,它将得到解决

我已下载并替换了JCE jar文件,现在我可以获得该页面的响应。

我的问题是, 据说该问题是由于该网站使用的是2048位加密,它将通过更换JCE jar of Unlimited Strength来解决。

但我可以看到我使用的大部分网址只有2048位加密,即使在打开的JDK 1.6中也能正常工作。

所以我怀疑可能还有其他原因只能为错误的URL获取上述异常。

任何人都可以帮助我......

1 个答案:

答案 0 :(得分:3)

Is there a workaround for: java.lang.RuntimeException: Could not generate DH keypair的Dupe。

确切地说,问题在于Diffie-Hellman 密钥协议密钥交换,超过1024位,而不是加密。 Java 6和7 - 至少来自Sun / Oracle - 具有此限制,而Unlimited Strength策略不会更改它。

除了转到Java 8(或者根本不是Java的代理,比如httpd或squid),使其工作的唯一方法是避免使用DHE 在想要使用大于1024的DH的服务器上进行密钥交换.Java 7(默认情况下)启用ECC套件,具体取决于 在服务器上通常会导致选择ECDHE而不是DHE,这可以避免这个问题。

要明确的是,在添加无限强度政策后,您是说相同的网址(或网站)有效?这有点奇怪。 无限强度策略 在客户提供的列表中启用AES-256密码套件;它可以想象服务器 接受(普通)RSA-AES256和DHE-RSA-AES128但不接受RSA-AES128,因此添加前者会改变选择。这也是可能的 Web服务器配置已更改,或者它实际上是服务器场或CDN或不同服务器实例略有不同的情况。

如果您正在谈论不同的网址/网站,一些网站很容易使用较小的DHE组或根本不使用DHE。

如果您正在检查"加密"通过查看浏览器证书显示 - 或在Java代码中的证书, 这是没有方便的GUI的相同数据 - 仅显示证书公钥大小, 几乎总是今天的RSA 2048(www.cabforum.org曾经鼓励 2048,并且从2014年开始他们需要它)。 没有什么要求DHE组与证书(RSA)密钥的大小相同,尽管它是一种很好的做法。 我不知道任何显示DHE大小(如果使用)的浏览器显示,并且Java API肯定不提供它。