Jenkins中的算法协商失败SSH

Posted

技术标签:

【中文标题】Jenkins中的算法协商失败SSH【英文标题】:Algorithm negotiation fail SSH in Jenkins 【发布时间】:2014-12-13 00:19:35 【问题描述】:

我正在尝试从 Jenkins SSH 到本地服务器,但抛出以下错误:

[SSH] Exception:Algorithm negotiation fail
    com.jcraft.jsch.JSchException: Algorithm negotiation fail
    at com.jcraft.jsch.Session.receive_kexinit(Session.java:520)
    at com.jcraft.jsch.Session.connect(Session.java:286)
    at com.jcraft.jsch.Session.connect(Session.java:150)
    at org.jvnet.hudson.plugins.SSHSite.createSession(SSHSite.java:141)
    at org.jvnet.hudson.plugins.SSHSite.executeCommand(SSHSite.java:151)
    at org.jvnet.hudson.plugins.SSHBuildWrapper.executePreBuildScript(SSHBuildWrapper.java:75)
    at org.jvnet.hudson.plugins.SSHBuildWrapper.setUp(SSHBuildWrapper.java:59)
    at hudson.model.Build$BuildExecution.doRun(Build.java:154)
    at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:533)
    at hudson.model.Run.execute(Run.java:1754)
    at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
    at hudson.model.ResourceController.execute(ResourceController.java:89)
    at hudson.model.Executor.run(Executor.java:240)
Finished: FAILURE

在 SSH 服务器上安装的 Java 版本:

java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b18)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)

客户端安装的java版本:

java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b18)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)

也试过这个解决方案: JSchException: Algorithm negotiation fail 但它不起作用。从腻子来看,一切似乎都很好。连接已建立,但当我触发 Jenkins 作业时,会引发错误。我应该尝试另一个版本的 ssh 服务器吗?现在我正在使用 copssh。

【问题讨论】:

我的回答对您有帮助吗?如果是这样,您能否将我的答案标记为已接受?谢谢! 抱歉迟到了。它现在正在工作。 【参考方案1】:

TL;DR 编辑您的 sshd_config 并在 KexAlgorithms 中启用对 diffie-hellman-group-exchange-sha1 和 diffie-hellman-group1-sha1 的支持:

KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1

我怀疑问题出现在 OpenSSH 6.7 中的以下更改之后:“已更改默认密码和 MAC 集以删除不安全的算法。”。 (见changelog)。该版本于 10 月 6 日发布,并于 10 月 21 日通过 Debian 测试(请参阅Debian changelog)。

OpenSSH 默认只启用以下密钥交换算法:

curve25519-sha256@libssh.org ecdh-sha2-nistp256 ecdh-sha2-nistp384 ecdh-sha2-nistp521 diffie-hellman-group-exchange-sha256 diffie-hellman-group14-sha1

而 JSch 声称支持 these algorithms(参见“功能”下)进行密钥交换:

diffie-hellman-group-exchange-sha1 diffie-hellman-group1-sha1

确实,他们无法就通用密钥交换算法达成一致。更新 sshd_config(并重新启动 SSH 服务器)可以解决问题。显然,JSch 应该从 0.1.50 版本开始支持“diffie-hellman-group-exchange-sha256”方法(参见changelog)。

【讨论】:

很好的修复,非常详细。 或者尝试升级到最新的 jsch 看看是否可以修复,在某些情况下可能会出现此错误消息 0.1.52 版解决了这个问题。 0.1.51 仍然有问题。 对于那些和我一样愚蠢的人,你需要把这一行放在 CLIENT 主机的 sshd_config 上(不是你的 jenkins 所在的那个,而是那个您尝试登录) @eviltnan:这实际上是服务器,而不是客户端。客户端是建立出站连接的,服务器是接受连接的。【参考方案2】:

如此处所述:http://sourceforge.net/p/jsch/mailman/message/32975616/,在 JSch 0.1.51 中实现了 diffie-hellman-group-exchange-sha256,但未启用。您可以使用setConfig 函数启用它,如下所示:

JSch jsch = new JSch();

java.util.Properties configuration = new java.util.Properties();
configuration.put("kex", "diffie-hellman-group1-sha1,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group-exchange-sha256");
configuration.put("StrictHostKeyChecking", "no");

Session session = jsch.getSession("username", "hostname", 22);
session.setPassword("password");
session.setConfig(configuration);
session.connect();

【讨论】:

【参考方案3】:

我们的 jenkins (2.21) 和 SSH 插件 (2.4) 遇到了同样的问题

我们的解决方案是使用 nativ shell 执行。 jenkins 插件似乎没有使用与 nativ shell 相同的 ssh 连接设置。

所以你可以让 ssh 像这样连接(没有 ssh-plugin):

ssh user@host <<'ENDSSH'
 echo your remote command here
ENDSSH 

如果您使用上面的代码包装远程命令,则连接工作正常。

使用此解决方案,您不再需要 ssh 插件。

供您参考:我们在 mittwald 服务器上遇到了问题,因为他们升级了那里的服务器上的 openssh。

【讨论】:

这对我来说是正确的答案。系统 SSH 很好,Jenkins 的 SSH (jsch) 是问题所在。最好的办法是升级 Jenkins,但这是一个很好的快速修复。 2.4 插件版本使用 0.1.42 jsch。它已经过时了。要以正确的方式使用插件,您必须自己从源代码(包含最新的 jsch - github.com/jenkinsci/ssh-plugin)编译它。 2.4 实际上是最新版本,但在 repo 中有一些尚未发布的新功能的提交。【参考方案4】:

就我而言 - 服务器上的 OpenSSH_6.7p1 - 我必须修改 KexAlgorithms 和 MAC(附加 hmac-md5、hmac-sha1、hmac-sha1-96、hmac-md5-96 值):

KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1

MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-ripemd160-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,hmac-ripemd160,umac-128@openssh.com,hmac-md5,hmac-sha1,hmac-sha1-96,hmac-md5-96

上面应该放:

/etc/ssh/sshd_config

然后重启ssh:

sudo /etc/init.d/ssh restart

【讨论】:

查看 /var/log/secure 失败的原因并将更改应用到 /etc/ssh/sshd_config【参考方案5】:

我遇到了完全相同的问题。 正如 Matthieu 建议的那样,我们必须在 cygwin>etc>sshd_config 中的 sshd-config 文件中添加一些密钥交换算法。 我刚刚添加了以下内容,它对我有用,

Kex 算法 diffie-hellman-group1-sha1,curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie- hellman-group14-sha1

但文件本身处于只读模式,因此我们必须通过命令提示符为其提供所有访问权限,如读、写和执行。 “chmode 777 sshd_config”。 然后添加上述算法。通过“net stop sshd”停止sshd服务,然后“net start sshd”启动它。

玩得开心....

【讨论】:

【参考方案6】:

除了在服务器端修复此问题,您还可以更新客户端。如果您在较新版本中使用 http://maven.apache.org/wagon/wagon-providers/wagon-ssh/(>= 2.12 - 截至 2018 年 9 月的当前版本为 3.2.0),则不会再出现此问题。

<project>
  <!-- ... -->
  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.6</version>
          <dependencies>
            <dependency>
              <groupId>org.apache.maven.wagon</groupId>
              <artifactId>wagon-ssh</artifactId>
              <version>3.2.0</version>
            </dependency>
          </dependencies>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
  <!-- ... -->
</project>

更新 2018-10-21:最新版本现在是 3.2.0。 由于各种漏洞问题,我建议始终使用当前版本的 SSH 或 SSL 相关软件。 因此,请检查并更新代码中的依赖项。

【讨论】:

【参考方案7】:

唯一对我有帮助的。

如果您想暂时解决此问题,只需下载“Jsch” 分钟。版本 0.1.53 并将其移动到 SSH 插件目录,对于 示例:cp /tmp/jsch-0.1.53.jar /var/lib/jenkins/plugins/ssh/WEB-INF/lib/ 别忘了重启 詹金斯您现在应该可以使用 Debian Jessie 构建您的工作了。

https://issues.jenkins-ci.org/browse/JENKINS-25258?focusedCommentId=274232&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-274232

【讨论】:

在 Jenkins 的行李追踪系统中对此问题进行投票可能会有所帮助 我认为最好的补丁 - 比将不安全协议重新添加到我的服务器更可取。请注意,我必须从ssh/WEB-INF/lib 中删除jsch-0.1.42.jar 并复制到jsch-0.1.53.jar。不知道它如何选择使用哪个,但新的 jar 具有不同的名称似乎并不重要。我在 windows 上运行 jenkins。【参考方案8】:

我在 Jenkins 控制台上也遇到了类似的异常问题。 然后我尝试了 Matthieu Wipliez 的解决方案。但它不起作用,因为我的 SSH 服务器(远程机器:Linux ubuntu 16.04)上已经完成了相同的配置。

花了几个小时后,我刚刚检查了我的 SSH 插件 的版本,它是 2.1,我刚刚将它更新到最新的 (2.5)。

猜猜它的作用!

我不知道它是否适用于所有类似的情况,但我建议先尝试一下。它可能会节省您的时间。

【讨论】:

【参考方案9】:

如果你因为在 PyCharm 中遇到同样的错误而来到这里 -

我使用的是 2016.2.3,只有转换为订阅模式才能升级。这个问题只出现在我的 Windows 盒子上。我无法按照其他答案(KexAlgorithms)中的描述更新远程服务器。

我的解决办法是

    点击帮助 选择“查找操作” 键入“切换 IDE 引导 JDK..” 使用下拉箭头并点击“...”选项 找到您在本地计算机上使用的 JAVA 版本并选择该文件夹。

PyCharm 重新启动,我可以通过 ssh 连接到远程服务器。

【讨论】:

以上是关于Jenkins中的算法协商失败SSH的主要内容,如果未能解决你的问题,请参考以下文章

JSchException:算法协商失败

无法连接到sftp:com.jcraft.jsch.JSchException:算法协商失败

安装 .net Framework 4.7.2 时,4.5.1 应用程序中的 TLS1.2 协商失败

WCF 安全支持提供程序接口 (SSPI) 协商失败

Jenkins 中的自动部署构建失败

Jenkins 中的单元测试失败