Алгоритм согласования сбоя SSH в Jenkins

Я пытаюсь ssh из Jenkins на локальный сервер, но выдается следующая ошибка:

[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

Установленная версия Java на сервере SSH:

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: согласование алгоритма не удалось, но оно не работает. С замазкой все вроде бы нормально. Соединение установлено, но когда я запускаю задание Jenkins, выдается ошибка. Должен ли я попробовать другую версию сервера SSH. Сейчас я пользуюсь копсш.

10 ответов

Решение

TL;DR отредактируйте ваш sshd_config и включите поддержку diffie-hellman-group-exchange-sha1 и diffie-hellman-group1-sha1 в KexAlgorithms:

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 по умолчанию был изменен для удаления небезопасных алгоритмов". (см. журнал изменений). Эта версия была выпущена 6 октября и сделана 21 октября для тестирования Debian (см. Журнал изменений Debian).

OpenSSH по умолчанию включает только следующие алгоритмы обмена ключами:

  • curve25519-sha256@libssh.org
  • ECDH-SHA2-nistp256
  • ECDH-SHA2-nistp384
  • ECDH-SHA2-nistp521
  • Диффи-Хеллмана-группа обменных sha256
  • Диффи-Хеллмана-group14-sha1

Принимая во внимание, что JSch утверждает, что поддерживает эти алгоритмы (см. В разделе "функции") для обмена ключами:

  • Диффи-Хеллмана-группа-обменно-sha1
  • Диффи-Хеллмана-group1-sha1

Так что, действительно, они не могут договориться об общем алгоритме обмена ключами. Обновление sshd_config (и перезапуск сервера SSH) делает свое дело. Очевидно, что JSch должен поддерживать метод diffie-hellman-group-exchange-sha256 начиная с версии 0.1.50 (см. Список изменений).

Как указано здесь: 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();

У нас была такая же проблема с нашими jenkins (2.21) и плагином SSH (2.4)

Наше решение заключается в использовании нативной оболочки. Похоже, что плагины jenkins не используют те же настройки соединения ssh, что и в нативной оболочке.

Таким образом, вы можете подключить ssh следующим образом (без ssh-плагина):

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

Если вы перенесете свои удаленные команды с кодом выше, соединение будет работать нормально.

С этим решением вам больше не нужен ssh-плагин.

Для вашего сведения: у нас возникла проблема на наших серверах mittwald, так как они обновили openssh на этих серверах.

В моем случае - 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

Вместо того, чтобы исправить это на стороне сервера, вы также можете обновить клиентскую часть. Если вы используете http://maven.apache.org/wagon/wagon-providers/wagon-ssh/ в более новой версии (>= 2.12 - текущая версия по состоянию на сентябрь 2018 года - 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. Поэтому, пожалуйста, проверьте и обновите ваши зависимости в вашем коде.

Я столкнулся с точно такой же проблемой. AS Matthieu предложил нам добавить некоторый алгоритм обмена ключами в файл sshd-config, представленный в cygwin>etc>sshd_config. Я только что добавил следующее, и это сработало для меня,

KexAlgorithms 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

Но сам файл находится в режиме только для чтения, поэтому мы должны предоставить ему все права доступа, такие как чтение, запись и выполнение, хотя и в командной строке. msgstr "chmode 777 sshd_config". затем добавьте вышеупомянутые алгоритмы. остановите службу sshd через "net stop sshd", а затем запустите ее "net start sshd".

Повеселись....

Только это помогло мне.

Если вы хотите временно решить эту проблему, просто загрузите "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

В нашем случае обновления алгоритмов kex оказалось недостаточно. Заглянув в лог sshd (sudo journalctl -xeu ssh), было зарегистрировано следующее:

      Unable to negotiate with a.b.c.d port 61644: no matching host key type found. Their offer: ssh-rsa,ssh-dss [preauth]

Мы только что обновили наш сервер до Ubuntu 22, которая, по-видимому, отключена как алгоритм ключа хоста. Поэтому решение заключалось в том, чтобы позволитьssh-rsaтакже. Редактировать/etc/ssh/sshd_config:

      HostKeyAlgorithms +ssh-rsa

И перезапустите демон ssh:sudo systemctl restart ssh

Я также столкнулся с той же проблемой с похожими исключениями на консоли Jenkins. Затем я попробовал решение Матье Виплиеса. Но это не сработало, поскольку такая же конфигурация уже была выполнена на моем SSH-сервере(Удаленная машина: Linux Ubuntu 16.04).

Потратив несколько часов, я просто проверил версию моего плагина SSH, которая была 2.1, и я только обновил ее до последней (2.5).

И угадайте, что это сработало!!

Я не знаю, будет ли это работать в каждом подобном случае, но я хотел бы предложить сначала попробовать. Это может сэкономить ваше время.

Если вы оказались здесь, потому что вы получаете ту же ошибку в PyCharm -

Я использую 2016.2.3 и могу обновиться только если перейду на модель подписки. Проблема видна только на моей коробке Windows. Мне не удалось обновить удаленный сервер, как описано в других ответах (KexAlgorithms).

Мое решение

  1. Нажмите Справка
  2. Выберите "Найти действие"
  3. Типа "Switch IDE Boot JDK.."
  4. Используйте стрелку выпадающего меню и нажмите "..."
  5. Найдите версию JAVA, которую вы используете на своем локальном компьютере, и выберите эту папку.

PyCharm перезагружается, и я могу подключиться к удаленным серверам.

Другие вопросы по тегам