【问题标题】:Spring SFTP Integration - Cannot Connect To Host Using known_hosts FileSpring SFTP 集成 - 无法使用 known_hosts 文件连接到主机
【发布时间】:2019-06-15 00:15:29
【问题描述】:

我正在尝试构建一个应用程序,该应用程序利用 Spring Boot 和 Integration 通过 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 并取消注释掉上面 sn-p 中的行,则无法建立连接。

2019-01-21 08:55:05.536 ERROR 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 shell 进行连接,而无需任何有关主机真实性的提示。

我错过了什么?

谢谢。

【问题讨论】:

  • 你知道Java应用程序是否有正确的权限来访问known_hosts文件吗?在大多数 *nix 环境中,.ssh 目录和其中的任何文件的文件权限都受到严格限制。
  • 有趣;我刚刚测试了 mac 到 mac 并遇到了同样的问题 - 我调试了 JSCH 客户端,它找到了密钥,但类型不匹配 - 在我的 known_hosts 文件中,类型是 ecdsa-sha2-nistp256 (类型 3)但是密钥交换返回的密钥报告为类型 2 (ssh-rsa)。
  • 在this answer 中找到了解决方法。

标签: spring-boot spring-integration jsch openssh


【解决方案1】:

有趣;我刚刚将它从 mac 测试到 mac 并遇到了同样的问题 - 我调试了 JSCH 客户端,它发现密钥正常,但类型不匹配 - 在我的 known_hosts 文件中,类型是 ecdsa-sha2-nistp256 (类型 3)但是密钥交换返回的密钥报告为类型 2 (ssh-rsa)。

我在this answer的帮助下解决了这个问题...

    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)也可以。

【讨论】:

  • 谢谢!我尝试了第一个解决方案(设置配置属性),但肯定会根据项目的开发方式查看其他解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-20
  • 1970-01-01
  • 1970-01-01
  • 2017-02-12
  • 1970-01-01
  • 1970-01-01
  • 2015-02-11
相关资源
最近更新 更多