SSL握手- java.security.InvalidAlgorithmParameterException问题

5

需要您针对Java问题提供建议。

目前我们在使用Java代码访问Web服务时遇到了问题。 我们的供应商正在使用SSL - RSA 2048位(SHA256withRSA)和DH(Diffie-Hellman算法),SSL的素数值大于1024。 我们生产环境中使用的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已知的一个bug/限制,它在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实现进行服务器端更改吗?还是我们只能在客户端使用它? 对于解决此问题的任何建议都将不胜感激。

请将您的Java 6更新至6u171版本或更高版本(无需升级)。 - rustyx
1个回答

1
BouncyCastle的JCE实现的jar包可以在Bouncy Castle加密套件的最新Java版本中下载。
所需的配置可在配置JCE提供程序中找到。
配置完成后,像以下代码一样打印安全提供程序信息。
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)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接