Я пытаюсь создать приложение, которое использует 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 без каких-либо запросов относительно подлинности хоста.
Что мне не хватает?
Спасибо.
Интересный; Я только что протестировал его от Mac к Mac и столкнулся с той же проблемой - я отлаживал клиент JSCH, и он находит ключ в порядке, но тип не совпадает - в моем файле known_hosts тип ecdsa-sha2-nistp256 (тип 3), но ключ возвращен при обмене ключами сообщается как тип 2 (ssh-rsa).
Найден обходной путь в этот ответ.




Интересный; Я только что протестировал его от 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) тоже работает.
Спасибо! Я попробовал первое решение (настройка свойства конфигурации), но, безусловно, могу рассмотреть и другие, в зависимости от того, как развивается проект.
Знаете ли вы, есть ли у приложения Java правильные права доступа к файлу
known_hosts? В большинстве сред *nix права доступа к файлам строго ограничены для каталога.sshи любых файлов внутри него.