Вопрос-ответ

How to resolve Java UnknownHostKey, while using JSch SFTP library?

Как разрешить Java UnknownHostKey при использовании библиотеки JSch SFTP?

Я запускаю Java-программу, в которой я переношу файл из одной папки в другую, используя Java SFTP. Проблема, с которой я сталкиваюсь, заключается в том, что я получаю следующую ошибку в моем Java SFTP (используя JSch) :


C:\Oracle\Middleware\Oracle_Home\oracle_common\jdk\bin\javaw.exe -сервер -путь к классу C:\JDeveloper\mywork\Java_Hello_World.adf;C:\JDeveloper\mywork\Java_Hello_World\Client\classes;C:\Users\ADMIN\Downloads\jsch-0.1.53.jar -Djavax.net.ssl.trustStore=C:\Users\IBM_AD~1\AppData\Local\Temp\trustStore5840796204189742395.jks FileTransfer com.jcraft.jsch.JSchException: UnknownHostKey: 127.0.0.1. Отпечаток ключа RSA равен a2: 39:3f: 44:88: e9: 1f: d7:d1:71: f4:85:98:fb: 90: dc в com.jcraft.jsch.Session.checkHost(Session.java:797) на com.jcraft.jsch.Session.connect(Session.java: 342) на com.jcraft.jsch.Session.connect(Session.java:183) в FileTransfer.main(FileTransfer.java:33) завершается с кодом выхода 0.


Ниже приведен мой код на данный момент:

FileTransfer fileTransfer = new FileTransfer();              

JSch jsch = new JSch();

try {

String host = "127.0.0.1";
int port = 22;

String user = "user";
Session session = jsch.getSession(user, host, port);
session = jsch.getSession("username", "127.0.0.1", 22);
session.connect(); // bug here , java.net.ConnectException

ChannelSftp sftp = null;
sftp = (ChannelSftp)session.openChannel("sftp") ; //channel;

//extra config code
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
// end extra config code

sftp.rename("C:\\Users\\ADMIN\\Desktop\\Work\\ConnectOne_Bancorp\\Java_Work\\SFTP_1\\house.bmp", "C:\\Users\\ADMIN\\Desktop\\Work\\ConnectOne_Bancorp\\Java_Work\\SFTP_2\\house.bmp");
session.disconnect();

} catch (JSchException e) {
e.printStackTrace();
} catch (SftpException e) {
e.printStackTrace();
} //end-catch

Мой Cygwin настроен, и я проверил (с помощью netstat -a -b ), что он запущен.

Переведено автоматически
Ответ 1

Вы пытаетесь пропустить проверку ключа хоста, установив StrictHostKeyChecking значение no.

Но вы должны сделать это перед проверкой, т. Е. перед session.connect().


В любом случае, вам никогда не следует этого делать, если вы не заботитесь о безопасности. Проверка ключа хоста предназначена для защиты вас от атак типа "человек посередине".

Вместо этого настройте ожидаемый ключ хоста, чтобы JSch мог его проверить.

Например:


  • Вызов, JSch.setKnownHosts предоставляющий путь к .ssh/known_hosts подобному файлу.


    Чтобы сгенерировать .ssh/known_hostsподобный файл, вы можете использовать ssh-keyscan команду из OpenSSH. Если вы подключаетесь с сервера * nix, у вас должна быть доступна команда, просто запустите


    ssh-keyscan example.com > known_hosts

    Он будет иметь формат, подобный:


    example.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA0hVqZOvZ7yWgie9OHdTORJVI5fJJoH1yEGamAd5G3werH0z7e9ybtq1mGUeRkJtea7bzru0ISR0EZ9HIONoGYrDmI7S+BiwpDBUKjva4mAsvzzvsy6Ogy/apkxm6Kbcml8u4wjxaOw3NKzKqeBvR3pc+nQVA+SJUZq8D2XBRd4EDUFXeLzwqwen9G7gSLGB1hJkSuRtGRfOHbLUuCKNR8RV82i3JvlSnAwb3MwN0m3WGdlJA8J+5YAg4e6JgSKrsCObZK7W1R6iuyuH1zA+dtAHyDyYVHB4FnYZPL0hgz2PSb9c+iDEiFcT/lT4/dQ+kRW6DYn66lS8peS8zCJ9CSQ==

    И ссылайтесь на сгенерированный known_hosts файл в вашем коде JSch.


    Если вы используете Windows, вы можете получить сборку для Windows ssh-keyscan из Win32-OpenSSH project или Git для Windows.


  • Вызовите JSch.getHostKeyRepository().add(), чтобы предоставить ожидаемый ключ хоста (например, жестко закодированный, в качестве других ваших учетных данных).


    Смотрите раздел Создание экземпляра JSch HostKey из открытого ключа в формате .pub.


Ответ 2

версия jsch : 0.1.55

моя проблема решена путем запуска :

ssh-keyscan -t rsa <HOST_NAME> >> ~/.ssh/known_hosts
ssh-keyscan -t rsa <IP_ADDRESS_OF_HOST_NAME> >> ~/.ssh/known_hosts

** в моем случае jsch искал ip-адрес в файле known_hosts

jsch.setKnownHosts(System.getProperty("user.home")+"/.ssh/known_hosts");
Ответ 3

В сторону: под "Cygwin", я полагаю, вы имеете в виду sshd или sftpd, потому что сам Cygwin не поддерживает SSH.

В любом случае, если вы хотите, чтобы клиент Jsch принимал какой-либо ключ от хоста, переместите .setConfig вызовы, которые устанавливают StrictHostKeyChecking no так, чтобы это было перед session.connect(). В качестве альтернативы вы должны предоставить доступ к хранилищу, содержащему правильные ключи для ваших хостов, как объясняет @Martin, - и вы всегда должны делать это при подключении к чему-либо, кроме "localhost", или, возможно, к машине, которая наверняка находится в том же физически защищенном сегменте сети (например, к концентратору проводной локальной сети в отдельной комнате).

java