SSL握手-java.security.InvalidAlgorithmParameterException问题

时间:2018-11-21 12:09:29

标签: 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.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的已知错误/限制,并且已在v7及更高版本中修复,但仍在“ 1.6.0.10”中存在

https://bugs.java.com/bugdatabase/view_bug.do?bug_id=7044060 https://bugs.java.com/bugdatabase/view_bug.do?bug_id=6521495

在上面的链接中,我发现以下语句–

  

客户提交的解决方法:使用BouncyCastle的JCE   实施,而不施加此限制,或诉诸   直接使用BigNumber API。

我们无法升级到最新的Java版本。有什么我们可以解决的SSL握手问题? 我们需要在服务器端进行更改以实现Bouncycastle吗?还是只能在客户端使用? 非常感谢您提供解决此问题的建议。

1 个答案:

答案 0 :(得分:0)

可以在LATEST JAVA RELEASES of Bouncy Castle Crypto package中下载BouncyCastle的JCE实现的jar。
所需的配置可以在To configure a JCE Provider中找到。
配置完成后。打印安全提供程序信息,如以下代码所示。

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)