Я пытаюсь использовать Jsch для установки SSH-соединения в Java. Мой код выдает следующее исключение:
com.jcraft.jsch.JSchException: UnknownHostKey: mywebsite.com.
RSA key fingerprint is 22:fb:ee:fe:18:cd:aa:9a:9c:78:89:9f:b4:78:75:b4
Я не могу найти, как проверить ключ хоста в документации Jsch. Я включил свой код ниже.
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
public class ssh {
public static void main(String[] arg) {
try {
JSch jsch = new JSch();
//create SSH connection
String host = "mywebsite.com";
String user = "username";
String password = "123456";
Session session = jsch.getSession(user, host, 22);
session.setPassword(password);
session.connect();
} catch(Exception e) {
System.out.println(e);
}
}
}
Ответы:
Я бы либо:
ssh
из командной строки и принимает открытый ключ (хост будет добавлен~/.ssh/known_hosts
и все должны работать отлично от JSch) -ИЛИ-Сконфигурируйте JSch, чтобы он не использовал «StrictHostKeyChecking» (это приводит к небезопасности и должно использоваться только для целей тестирования), используя следующий код:
Вариант № 1 (добавление хоста в
~/.ssh/known_hosts
файл) имеет мои предпочтения.источник
JSch#setConfig("StrictHostKeyChecking", "no")
будет выполнять ту же работу, но только в одной строке~/.ssh/config
файл для исправления вышеуказанной ошибки, когда у меня не было доступа к изменению исходного кодаХотя на этот вопрос был дан общий ответ, я обнаружил, что есть случай, когда даже существующая запись known_hosts не помогает. Это происходит, когда сервер SSH отправляет отпечаток ECDSA, и в результате у вас будет такая запись:
Проблема в том, что JSch предпочитает SHA_RSA и при подключении попытается сравнить отпечаток SHA-RSA, что приведет к ошибке об «неизвестном хосте».
Чтобы это исправить, просто запустите:
или пожаловаться Jcraft на предпочтение SHA_RSA вместо использования локальной настройки HostKeyAlgorithms , хотя они, похоже, не слишком хотят исправлять свои ошибки .
источник
ecdsa-sha2-nistp384
вами, и ваше решение работает очень хорошо. Соответственно руководству openssh-keyscan и нам нужно, мы запускаемssh-keyscan -t rsa,ecdsa example.org >> known_hosts
.Это риск безопасности, чтобы избежать проверки ключа хоста.
JSch использует интерфейс HostKeyRepository и его класс по умолчанию реализации KnownHosts для управления этим. Вы можете предоставить альтернативную реализацию, которая позволяет определенные ключи, реализуя HostKeyRepository. Или вы можете сохранить ключи, которые вы хотите разрешить, в файле в формате known_hosts и вызвать
Или с открытым ключом String, как показано ниже.
см. Javadoc для более подробной информации.
Это было бы более безопасным решением.
Jsch с открытым исходным кодом, и вы можете скачать исходный код здесь . В папке примеров найдите файл KnownHosts.java, чтобы узнать больше подробностей.
источник
В зависимости от того, какую программу вы используете для ssh, способ получения правильного ключа может отличаться. Putty (популярный в Windows) использует свой собственный формат для ключей ssh. С большинством вариантов Linux и BSD, которые я видел, вам просто нужно посмотреть
~/.ssh/known_hosts
. Я обычно ssh с машины Linux и затем копирую этот файл на машину Windows. Тогда я использую что-то похожее наПредполагая, что я поместил файл
C:\Users\cabbott
на моем компьютере с Windows. Если у вас нет доступа к машине с Linux, попробуйте http://www.cygwin.com/Может быть, кто-то еще может предложить другую альтернативу Windows. Я нахожу способ замазки обработать ключи SSH, храня их в реестре в нестандартном формате.
источник
cygwin
(вы должны загрузитьopenssl
пакет и зависимости), я смог скачать~/.ssh/known_hosts
. Благодаря @CharityAbbott.Предоставить открытый ключ RSA хоста: -
источник
Вы также можете просто сделать
Это небезопасно, и это обходной путь, не подходящий для живой среды, поскольку он отключит всемирно известную проверку ключей хоста.
источник
Вы также можете выполнить следующий код. Это проверено и работает.
Пожалуйста, подставьте соответствующие значения.
источник
Просто замените «user», «pass», «SSHD_IP». И создайте файл под названием known_hosts.txt с содержимым ~ / .ssh / known_hosts сервера. Вы получите раковину.
источник
config.put("StrictHostKeyChecking", "no");
ручноеssh -v
подключение раскрывает.ssh/known_hosts
файл действительно содержит ключ (ecdsa-sha2-nistp256
) , но код делает это:com.jcraft.jsch.JSchException: UnknownHostKey: 131.132.x.x. RSA key fingerprint is c2:...
at com.jcraft.jsch.Session.checkHost(Session.java:805)
at com.jcraft.jsch.Session.connect(Session.java:345)
установка известного хоста лучше, чем установка значения fingure print.
Когда вы устанавливаете известный хост, попробуйте вручную ssh (самый первый раз, перед запуском приложения) из поля, в котором запускается приложение.
источник
Я потерял много времени на эту глупую проблему, и я думаю, что сообщение совершенно верно: «в файле, к которому я обращаюсь, нет хоста», но в вашей системе может быть больше, чем файл know_host (как, например, я Я использую mobaXterm, и он хранится внутри директории установки, монтируя дом из этого корня).
Если у вас возникли проблемы: он работает из командной строки, но не из приложения, попробуйте получить доступ к удаленному серверу с помощью ssh и проверьте с опцией verbose -v, какой файл используется в настоящее время, например, следующим образом:
как вы видите ключ был найден в:
а не в моем доме Windows под C: \ Users \ my_local_user \ .ssh, я просто слил их и выровнял для решения проблемы.
Надеюсь, что это поможет кому-то в будущем
источник
Эта запись в стеке описывает поток-ключ и не имеет отношения к аутентификации с открытым ключом.
Что касается аутентификации с открытым ключом, попробуйте следующий пример с вашим простым (не зашифрованным) закрытым ключом,
источник
источник