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
)也有效。
我正在尝试构建一个应用程序,该应用程序利用 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_hostsssh -o HostKeyAlgorithms=ssh-rsa <host>
(或ssh-keyscan
)也有效。