Алгоритм согласования сбоя 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.
В нашем случае обновления алгоритмов 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).
Мое решение
- Нажмите Справка
- Выберите "Найти действие"
- Типа "Switch IDE Boot JDK.."
- Используйте стрелку выпадающего меню и нажмите "..."
- Найдите версию JAVA, которую вы используете на своем локальном компьютере, и выберите эту папку.
PyCharm перезагружается, и я могу подключиться к удаленным серверам.