问题现象:
java程序运行过程中需要通过SSH与服务端建立安全连接,本地使用过程中未发现问题,线上部署的时候出现较多的异常,显示Prime size must be multiple of 64, and can only range from 512 to 1024 (inclusive),调用栈如下:
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)
... 10 more
问题原因:
Java可接受的最大大小为1024位。这是一个已知问题(请参阅JDK-6521495)。
可以使用BouncyCastle的JCE实现的解决方法,BouncyCastle就是一个提供了很多哈希算法和加密算法的第三方库。它提供了Java标准库没有的一些算法。
解决步骤:
1)下载安全jar包
BouncyCastle可以从www.bouncycastle.org下载,使用最新版本即可,下载路径:
http://www.bouncycastle.org/latest_releases.html。点击下载
2)将JAR文件拷贝到适当位置
如果想让JCE类可以被所有的JAVA应用程序使用,我们需要把下载的JAR文件安装为一个扩展。
找到jdk的安装扩展目录,把jar包放置到这里
例如:/usr/local/java/jdk1.8.0_92/jre/lib/ext
3)配置JDK安全属性文件
安全属性文件java.security位于和/lib/ext平行的另一个目录/lib/security下,它定义了当前可以使用的加密提供者。
打开java.security文件,注释掉security.provider.1=sun.security.provider.Sun不使用jdk默认的加密提供者,添加新的加密提供者security.provider.1=org.bouncycastle.jce.provider.BouncyCastleProvider
修改为如下配置文件:
也可以在:
security.provider.1=sun.security.provider.Sun
后面加上,其他后面的冲突序列依次修改。
security.provider.2=org.bouncycastle.jce.provider.BouncyCastleProvider
它表明本虚拟机有两个加密提供者以及他们的优先级和访问时使用的名称。当需要用到一个加密算法时,虚拟机会依次访问这里列出的提供者,寻找想要的算法,并按这里的优先级顺序使用第一个找到的算法。
验证结果:
重新启动jar包,ssh连接正常,异常日志消失。