【发布时间】:2023-04-07 16:55:02
【问题描述】:
我正在使用 JSch 在多个 VPS 上部署各种文件。我能够在关闭StrictHostKeyChecking 的情况下获得一个工作原型。我现在想重新启用主机密钥检查,这样我就不会受到 MITM 攻击。目前,客户端是连接到运行 Debian 的 VPS 的 Windows 机器。这是我到目前为止所做的:
- 使用
"ssh-keyscan -t rsa <serverIp> >> ~/.ssh/known_hosts"在我的本地机器(Windows客户端)上添加了远程IP地址 - 将我的
known_hosts文件的路径传递给我的应用程序中的JSch.setKnownHosts。
尝试建立连接时,结果是
com.jcraft.jsch.JSchException: UnknownHostKey: 。 RSA 密钥指纹是
这显然是由于我对主机密钥的工作原理或密码学缺乏了解。根据我的基本理解,known_hosts 文件包含一个密钥。该密钥用于确保我们连接的远程 IP 是他们所说的,从而防止任何人试图“欺骗”自己作为服务器。
我的known_hosts 文件看起来像
184.154.70.174 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDNv4m+tOZUipp8UDGrd+kbtsM5R+tu3ZYZi3p7OTRWUX/Wqy74pONlLqI+/WGu77EHnOfdssJfclgo37vKLRFKneXZNAMXE7FUu5yUNOHlpPwzmvYUT/sp1k9CeNrtJAbkm05pOBIDqDQQGfQ+IAw9zqqo/sqJ6c8NKiVFAt4Ud0msvedb559dhYgcjwb52ABbsJ0mZ8FnU7LKG1592/ZTtYxam+M3qMhtJacrh5gpfZjjx2lGhqpOgvM+xwWeK6DQVn0QyIJd474G3gcm4M43ErRfzXOum3p/0wOw+hL1ora9eWSz2Wf9WuDXf86xkbZPD7Gy6ER5LBhquy331p7X
而我的代码是(SSH 是 JSch 的一个实例):
try {
SSH.setKnownHosts(new FileInputStream("C:/Users/nvulc/.ssh/known_hosts"));
SSH.addIdentity(keyPath, keyPass);
Session session = SSH.getSession("root", "184.154.70.174", 22);
session.connect();
} catch (Exception e) {
e.printStackTrace();
}
结果:
com.jcraft.jsch.JSchException: UnknownHostKey: 184.154.70.174. RSA key fingerprint is b4:79:5a:58:d3:15:ad:a9:c7:af:cc:d7:09:f5:40:62
at com.jcraft.jsch.Session.checkHost(Session.java:805)
at com.jcraft.jsch.Session.connect(Session.java:345)
at com.jcraft.jsch.Session.connect(Session.java:183)
at Main.main(Main.java:40)
【问题讨论】: