我有一个设置,其中我在 Solaris 服务器上通过
sshexec
中的 ANT
任务连接来执行 Jenkins 的构建。
触发构建时,会抛出以下错误:
com.jcraft.jsch.JSchException:Session.connect: java.security.InvalidAlgorithmParameterException:DH密钥大小必须是 64 的倍数,范围只能是 512 到 2048(含)。这 不支持特定密钥大小 2047。
经过一些谷歌搜索,我知道可以通过更新到Java 8来修复它。我这样做了,但是仍然没有成功。
有人可以告诉我如何解决吗?
我们的修复:
Security.insertProviderAt(new BouncyCastleProvider(), 1)
我们直接使用 Jsch 0.1.54 连接到 SFT 服务器并看到:
java.security.InvalidAlgorithmParameterException:DH 密钥大小必须是 64 的倍数,并且只能在 512 到 4096(含)范围内。不支持特定密钥大小2047
可能相关
JSch 库(由 Jenkins 或其插件之一使用)利用 Java 的 JCE 提供程序。您的 Java 版本的 JCE 提供程序似乎无法处理 2047 位的密钥长度。
您可以将当前的 JCE 提供商替换为 BouncyCastle 提供商。
虽然 @Brian Low 的解决方法描述了将 BouncyCastle 动态注册为加密包提供程序,但我想指出另一种方法,即通过静态注册配置环境来完成此操作。
查找“Signed JAR Files”部分并选择您的提供商。例如,bcprov-jdk15to18-165.jar,适用于 5 到 8 之间的任何 Java 版本。
在这里,我们将 BouncyCastle 提供者插入到第一个位置(最喜欢的位置)并更新其他人的偏好编号。
示例:
#
# List of providers and their preference orders (see above):
#
security.provider.1=org.bouncycastle.jce.provider.BouncyCastleProvider
security.provider.2=sun.security.provider.Sun
security.provider.3=sun.security.rsa.SunRsaSign
security.provider.4=sun.security.ec.SunEC
security.provider.5=com.sun.net.ssl.internal.ssl.Provider
security.provider.6=com.sun.crypto.provider.SunJCE
security.provider.7=sun.security.jgss.SunProvider
security.provider.8=com.sun.security.sasl.Provider
security.provider.9=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.10=sun.security.smartcardio.SunPCSC
security.provider.11=sun.security.mscapi.SunMSCAPI
此时重启Jenkins。
@ravbarKomanda 由于我使用 Java 11 并且自 Java 版本 9 以来,“ext”文件夹消失了,我如何摆脱 java 11 中的 dh 键问题?
非常感谢!