Интеграция Spring SFTP — невозможно подключиться к хосту с помощью файла known_hosts

Я пытаюсь создать приложение, которое использует Spring Boot и 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 ERROR 10680 --- [ask-scheduler-1] o.s.integration.handler.LoggingHandler : org.springframework.messaging.MessagingException: Problem occurred while synchronizing 'sftp-outbound' to local directory; nested exception is org.springframework.messaging.MessagingException: Failed to execute on session; nested exception is org.springframework.integration.util.PoolItemNotAvailableException: Failed to obtain pooled item

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

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

Спасибо.

Знаете ли вы, есть ли у приложения Java правильные права доступа к файлу known_hosts? В большинстве сред *nix права доступа к файлам строго ограничены для каталога .ssh и любых файлов внутри него.

Alex W 21.01.2019 19:17

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

Gary Russell 21.01.2019 19:50

Найден обходной путь в этот ответ.

Gary Russell 21.01.2019 20:25
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
1
3
2 203
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Интересный; Я только что протестировал его от 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 к known_hosts, как описано в ссылках.

Подтверждено, что перестроение known_hosts с помощью

ssh -o HostKeyAlgorithms=ssh-rsa <host>

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

Спасибо! Я попробовал первое решение (настройка свойства конфигурации), но, безусловно, могу рассмотреть и другие, в зависимости от того, как развивается проект.

KellyM 21.01.2019 22:00

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