Интеграция Spring SFTP - Невозможно подключиться к хосту с помощью файла known_hosts - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь создать приложение, которое использует Spring Boot and Integration для извлечения файлов из удаленной системы через SSH.Это прекрасно работает, если я установил для свойства allowUnknownKeys SessionFactory значение true.

@Bean
public SessionFactory<LsEntry> sftpSessionFactory() {
    DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true);
    factory.setHost("x");
    factory.setPort(22);
    factory.setUser("x");
    factory.setPassword("x");
    factory.setAllowUnknownKeys(true);
    // factory.setHostKeyAlias("x");
    // factory.setKnownHosts(
    //         System.getProperty("user.home") + File.separator + ".ssh" + File.separator + "known_hosts");

    return new CachingSessionFactory<LsEntry>(factory);
}

Однако, если установить allowUnknownKeys в значение false и раскомментировать строки в фрагменте выше, соединение не можетбыть установленным.

2019-01-21 08: 55: 05.536 ОШИБКА 10680 --- [ask-scheduler-1] osintegration.handler.LoggingHandler: org.springframework.messaging.MessagingException: возникла проблема при синхронизации 'sftp-outbound в локальный каталог;вложенным исключением является org.springframework.messaging.MessagingException: не удалось выполнить в сеансе;вложенное исключение - org.springframework.integration.util.PoolItemNotAvailableException: не удалось получить объединенный элемент

Основная причина заключается в том, что «подлинность хоста» не может быть установлена, и она требует от менядать разрешение на установление связи.Это я поняла.Однако моя проблема заключается в том, почему он неправильно читает / анализирует файл known_hosts?Тот, который я передаю, автоматически генерируется, и он прекрасно работает, когда я запускаю ssh в систему через командную строку.Используя точки останова, я убедился, что приложение находит и читает правильный файл known_hosts.Я могу использовать точно такие же учетные данные и подключаться через оболочку Bash без каких-либо подсказок относительно подлинности хоста.

Чего мне не хватает?

Спасибо.

1 Ответ

0 голосов
/ 21 января 2019

Интересный; Я только что протестировал его с mac на mac, и у меня возникла та же проблема - я отладил клиент JSCH, и он нашел ключ в порядке, но тип не совпадает - в моем файле known_hosts тип ecdsa-sha2-nistp256 (тип 3), но ключ, возвращаемый обменом ключами, указывается как тип 2 (ssh-rsa).

Я решил с помощью этот ответ ...

    Properties sessionConfig = new Properties();
    sessionConfig.setProperty("server_host_key", "ecdsa-sha2-nistp256");
    factory.setSessionConfig(sessionConfig);

Или вы можете добавить ключ ssh-rsa к известному_хосту, как описано в ссылках там.

Подтвердил, что восстановление известных_хостов с помощью

ssh -o HostKeyAlgorithms=ssh-rsa <host>

(или ssh-keyscan) тоже работает.

...