DH 密钥大小必须是 64 的倍数,并且只能在 512 到 2048(含)范围内

问题描述 投票:0回答:3

我有一个设置,其中我在 Solaris 服务器上通过

sshexec
中的
ANT
任务连接来执行 Jenkins 的构建。

触发构建时,会抛出以下错误:

com.jcraft.jsch.JSchException:Session.connect: java.security.InvalidAlgorithmParameterException:DH密钥大小必须是 64 的倍数,范围只能是 512 到 2048(含)。这 不支持特定密钥大小 2047。

经过一些谷歌搜索,我知道可以通过更新到Java 8来修复它。我这样做了,但是仍然没有成功。

有人可以告诉我如何解决吗?

java jenkins ssh ant solaris-10
3个回答
9
投票

我们的修复:

Security.insertProviderAt(new BouncyCastleProvider(), 1)

我们直接使用 Jsch 0.1.54 连接到 SFT 服务器并看到:

java.security.InvalidAlgorithmParameterException:DH 密钥大小必须是 64 的倍数,并且只能在 512 到 4096(含)范围内。不支持特定密钥大小2047

可能相关


0
投票

JSch 库(由 Jenkins 或其插件之一使用)利用 Java 的 JCE 提供程序。您的 Java 版本的 JCE 提供程序似乎无法处理 2047 位的密钥长度。

您可以将当前的 JCE 提供商替换为 BouncyCastle 提供商。

虽然 @Brian Low 的解决方法描述了将 BouncyCastle 动态注册为加密包提供程序,但我想指出另一种方法,即通过静态注册配置环境来完成此操作。

查找“Signed JAR Files”部分并选择您的提供商。例如,bcprov-jdk15to18-165.jar,适用于 5 到 8 之间的任何 Java 版本。

  • 在 Jenkins 中,转到管理 Jenkins - 全局工具配置 - JDK 来验证您的 JDK 位置 (JAVA_HOME)。
  • 将 JAR 文件复制到 $JAVA_HOME/jre/lib/ext
  • 找到并编辑 $JAVA_HOME/jre/lib/security/java.security

在这里,我们将 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。


0
投票

@ravbarKomanda 由于我使用 Java 11 并且自 Java 版本 9 以来,“ext”文件夹消失了,我如何摆脱 java 11 中的 dh 键问题?

非常感谢!

© www.soinside.com 2019 - 2024. All rights reserved.