我正在测试一个Java应用程序。我正在尝试开始使用DH加密套件进行SSL握手。但我得到了以下错误:
java.lang.RuntimeException: Could not generate DH keypair有些人建议使用BouncyCastle,但是很多人报告了它的错误,所以如果有其他选择的话,我不鼓励使用它。
有人建议从Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files下载http://www.oracle.com/technetwork/java/javase/downloads/index.html。我在java.security和java.policy中替换了C:\Program Files (x86)\Java\jre7\lib\security中的以下两个文件。请注意,我还注意到Java\jre7\security安装在:Program Files (x86)和Program Files中,并替换了两者。但是,我还是看到了同样的错误。
这个错误有什么解决办法吗?
编辑:堆栈跟踪:
javax.net.ssl.SSLException: java.lang.RuntimeException: Could not generate DH keypair
at sun.security.ssl.Alerts.getSSLException(Unknown Source)
at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source)
at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source)
at sun.security.ssl.SSLSocketImpl.handleException(Unknown Source)
at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at MyClass.MyClass.myFunction(MyProg.java:78)
at MyClass.MyClass.main(MyClass.java:233)
Caused by: java.lang.RuntimeException: Could not generate DH keypair
at sun.security.ssl.DHCrypt.<init>(Unknown Source)
at sun.security.ssl.ClientHandshaker.serverKeyExchange(Unknown Source)
at sun.security.ssl.ClientHandshaker.processMessage(Unknown Source)
at sun.security.ssl.Handshaker.processLoop(Unknown Source)
at sun.security.ssl.Handshaker.process_record(Unknown Source)
at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
... 4 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(Unknown Source)
... 11 moreEDIT2: --我的代码充当了一个客户端,试图与远程服务器(网站)启动SSL握手。我将客户的密码套件列表设置为:
{
"TLS_ECDHE_RSA_WITH_RC4_128_SHA",
"TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA",
"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256",
"TLS_ECDHE_RSA_WITH_NULL_SHA",
"TLS_DHE_RSA_WITH_AES_128_CBC_SHA256",
"TLS_DHE_RSA_WITH_AES_128_CBC_SHA",
"SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA",
"SSL_DHE_RSA_WITH_DES_CBC_SHA",
"SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA"
};客户端列表中的所有密件都由Java支持。当服务器提供长DH密钥时,如何配置Java客户端以支持发起SSL握手?
发布于 2014-02-07 01:39:44
是的,基本上6851461的欺骗也是9162249和10687200。无限实力政策不是解决问题的办法。
SSL/TLS客户端中DHE (和其他DH)的主要大小是而且必须根据从服务器接收的参数来设置,客户端不能选择不同的东西。(这是堆栈跟踪中的ClientHandshaker.serverKeyExchange。)
您已经有了ECDHE(在Java 7中工作正常,或者如果您添加了一个ECC提供程序(例如,但不一定是BouncyCastle)优先于DHE),而且服务器没有选择它。您没有提供普通的RSA;如果您愿意不进行前向保密,而且服务器也是如此,那么尝试在_RSA_WITH_AES_128_CBC_SHA _RSA_WITH_RC4_128_SHA之前添加至少一些套件(或代替_DHE_RSA )。
另一种可能是要求服务器运营商使用DH 1024位,如果他们愿意和允许的话。它实际上还没有被破坏,但它被一些重要的标准所禁止。
https://stackoverflow.com/questions/14253039
复制相似问题