SSL握手-java.security.invalidalgorithParameterException问题
需要您对java问题的建议 目前,我们在使用java代码访问web服务时遇到了一个问题。 我们的供应商正在使用SSL-RSA 2048位(SHA256withRSA)和DH(Diffie-Hellman算法)素数值大于1024的SSL。 我们已经在生产java版本1.6.0.10 当我们执行代码时,我们得到了错误——SSL握手-java.security.invalidalgorithParameterException问题,java,ssl,java-6,Java,Ssl,Java 6,需要您对java问题的建议 目前,我们在使用java代码访问web服务时遇到了一个问题。 我们的供应商正在使用SSL-RSA 2048位(SHA256withRSA)和DH(Diffie-Hellman算法)素数值大于1024的SSL。 我们已经在生产java版本1.6.0.10 当我们执行代码时,我们得到了错误—— Caused by: java.lang.RuntimeException: Could not generate DH keypair at com.sun.net.ssl.in
Caused by: java.lang.RuntimeException: Could not generate DH keypair at com.sun.net.ssl.internal.ssl.DHCrypt.<init>(DHCrypt.java:106)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverKeyExchange(ClientHandshaker.java:556)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:183)
at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:593)
at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:529)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:893)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1138)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1165)
... 6 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(DashoA13*..)
at java.security.KeyPairGenerator$Delegate.initialize(KeyPairGenerator.java:627)
at com.sun.net.ssl.internal.ssl.DHCrypt.<init>(DHCrypt.java:100) ... 13 more
原因:java.lang.RuntimeException:无法在com.sun.net.ssl.internal.ssl.DHCrypt上生成DH密钥对。(DHCrypt.java:106)
在com.sun.net.ssl.internal.ssl.ClientHandshaker.serverKeyExchange上(ClientHandshaker.java:556)
在com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:183)上
位于com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:593)
位于com.sun.net.ssl.internal.ssl.Handshaker.process_记录(Handshaker.java:529)
位于com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:893)
位于com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1138)
位于com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1165)
... 还有6个
原因:java.security.invalidalgorithParameterException:Prime size必须是64的倍数,并且只能在com.sun.crypto.provider.DHKeyPairGenerator.initialize(DashoA13*)上介于512到1024之间(包括512和1024之间)
位于java.security.KeyPairGenerator$Delegate.initialize(KeyPairGenerator.java:627)
在com.sun.net.ssl.internal.ssl.DHCrypt.(DHCrypt.java:100)。。。还有13个
这是java的已知缺陷/限制,在v7及以后版本中已经修复,但在“1.6.0.10”中仍然存在
在上面的链接中,我发现了下面的陈述-
客户提交的解决方案:使用BouncyCastle的JCE
实现,而不施加此限制,或诉诸
bignumerapi直接调用
我们无法升级到最新的java版本。我们可以实现什么来解决这个SSL握手问题?
bouncycastle实现是否需要服务器端更改?或者我们只能在客户端使用?
任何关于解决此问题的建议都将受到高度赞赏 BouncyCastle的JCE实现的jar可以在中下载。
所需的配置可在中找到。
配置完成后。按照以下代码打印安全提供程序信息
Provider[] providers = Security.getProviders();
for (int i = 0; i != providers.length; i++)
{
System.out.println(providers[i].getInfo());
}
查看是否显示“BouncyCastle Security Provider v1.60”(假设您正在下载1.6版)将Java 6更新为6u171或更高版本(无需升级)。