JSch SFTP 安全性与 session.setConfig("StrictHostKeyChecking", "no");

Posted

技术标签:

【中文标题】JSch SFTP 安全性与 session.setConfig("StrictHostKeyChecking", "no");【英文标题】:JSch SFTP security with session.setConfig("StrictHostKeyChecking", "no"); 【发布时间】:2015-07-22 14:56:21 【问题描述】:

我使用 JSch 和 FTP 文件的私钥

    jsch.addIdentity(privatekeyfile); 会话会话 = jsch.getSession("user", "domain.com" ,22); session.setConfig("StrictHostKeyChecking", "no");

第 3 行有问题。没有这一行,JSch 就无法工作。

我的问题是: 第 3 行会使 SFTP 传输不安全吗?

【问题讨论】:

【参考方案1】:

禁用StrictHostKeyChecking 选项将使连接的安全性低于启用该选项,因为它可以让您连接到远程服务器而无需验证其 SSH 主机密钥。如果启用该选项,您将只能连接到您的 SSH 客户端已知密钥的服务器。

您必须确定这对您的特定用例意味着什么 - 您是在专用本地网络上连接的服务器还是通过互联网连接?这是测试环境还是生产环境?

如有疑问,最好选择更安全的方式。我建议启用StricktHostKeyChecking 并使用setKnownHosts method 提供一个包含远程主机密钥的文件。

【讨论】:

感谢 krautmeyer 和 Martin。 setKnownHosts 需要一个文件。文件在哪里?我通过 FTP 连接到 AWS EC2 Linux 实例。创建实例时,我得到了我的私有密钥文件。但是在方法 setKnownHosts 中设置什么?谢谢! 该文件需要在运行您的程序的客户端上可用。如果您有权访问 Linux 机器,您可以自己生成文件:ssh-keyscan -t rsa hostname > known_hosts 在这种情况下,主机名将是您要连接的目标服务器。然后只需将文件传递给setKnownHosts 方法。 谢谢。我登录 Linux 并运行:ssh-keyscan -t rsa abc.com > /home/known_hosts。一个文件 known_hosts 在 home 中创建但为空。 abc.com 是我用来 FTP 到此服务器的域。谢谢。 尝试运行ssh-keyscan -t rsa abc.com 并发布输出。 $ ssh-keyscan -t rsa abc.com 什么也不输出。它完成并返回命令行。 $ ssh-keyscan -t rsa abc.com$【参考方案2】:

是的,它会降低连接(和传输)的安全性。特别是,它使连接打开到Man-in-the-middle attacks。

您永远不应将StrictHostKeyChecking 设置为no,除非您不关心安全性(例如在专用网络中连接时)。

“没有这行,JSch 就不行”是不正确的。您只需让您的代码接受预期的服务器主机密钥。通过setKnownHostssetHostKeyRepository 方法。

例如,见How to resolve Java UnknownHostKey, while using JSch SFTP library?


您可以阅读我在verifying the host key 上的文章以了解其重要性。这是关于 WinSCP SSH/SFTP 客户端的,但对于任何 SSH 客户端/库通常都是如此。

【讨论】:

以上是关于JSch SFTP 安全性与 session.setConfig("StrictHostKeyChecking", "no");的主要内容,如果未能解决你的问题,请参考以下文章

无法连接到sftp:com.jcraft.jsch.JSchException:算法协商失败

如何使用jcraft 模拟SFTP登陆

JAVA SFTP文件上传下载及批量下载

使用 jsch 库在 sftp 中复制文件

JSch - Java实现的SFTP(文件下载详解篇)

JSch - Java实现的SFTP(文件上传详解篇)