Wil*_*m A 5 java sockets ssl network-programming
我正在测试Java应用程序。我正在尝试使用DH密码套件开始SSL握手。但我收到以下错误:
java.lang.RuntimeException: Could not generate DH keypair
Run Code Online (Sandbox Code Playgroud)
有些人提出了建议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 more
Run Code Online (Sandbox Code Playgroud)
EDIT2: 我的代码充当客户端,试图与远程服务器(网站)启动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"
};
Run Code Online (Sandbox Code Playgroud)
Java支持客户端列表中的所有密码套件。服务器提供长的DH密钥时,如何配置Java客户端以支持启动SSL握手?
是的,基本上是#6851461、#9162249 和#10687200 的欺骗。无限强度政策不是解决方案。
SSL/TLS 客户端中 DHE(和其他 DH)的素数大小必须根据从服务器接收到的参数进行设置,客户端不能选择不同的值。(这是堆栈跟踪中的 ClientHandshaker.serverKeyExchange。)
您已经拥有优先于 DHE-RSA 的 ECDHE-RSA(如果您添加 ECC 提供程序,例如但不一定是 BouncyCastle,则在 Java 7 或 6 中工作正常),并且服务器没有选择它。您不提供普通 RSA;如果您愿意不使用前向保密并且服务器也是如此,请尝试在 _DHE_RSA 之前(或代替)添加至少一些套件,例如 _RSA_WITH_AES_128_CBC_SHA _RSA_WITH_RC4_128_SHA 。
另一种可能性是要求服务器运营商使用 DH 1024 位(如果他们愿意且允许的话)。它实际上还没有被破坏,但它被一些重要标准所禁止。