Spring SFTP 集成 - 无法使用 known_hosts 文件连接到主机

Spring SFTP Integration - Cannot Connect To Host Using known_hosts File

我正在尝试构建一个应用程序,该应用程序利用 Spring 引导和集成通过 SSH 从远程系统检索文件。如果我将 SessionFactory 的 allowUnknownKeys 属性 设置为 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

根本原因是"authenticity of the host"无法建立连接,要我授权建立连接。我明白这一点。但是,我的问题是为什么 reading/parsing 文件 known_hosts 不正确?我传递给它的那个是自动生成的,当我通过命令行 ssh 进入系统时它工作正常。使用断点,我已验证应用程序正在查找和读取正确的 known_hosts 文件。我可以使用完全相同的凭据并通过 bash shell 进行连接,而无需任何有关主机真实性的提示。

我错过了什么?

谢谢。

有趣;我刚刚测试了它 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)也有效。