JSch:UnknownHostKey 异常,即使主机密钥指纹存在于 known_hosts 文件中也是如此
JSch: UnknownHostKey exception even when the hostkey fingerprint is present in the known_hosts file
已经有两个关于此异常的问题:
- JSchException: UnknownHostKey 和
- com.jcraft.jsch.JSchException: UnknownHostKey
我正在使用 Windows 机器并尝试连接到使用 Vag运行t 运行 Ubuntu 创建的虚拟机。这是我的代码:
public static void main(String[] args) {
String host = "localhost";
String username = "vagrant";
int port = 2200;
String privateKey = "C:\keys\openSSH_pair1\open_ssh_private";
JSch js = new JSch();
try {
js.addIdentity(privateKey, "pass");
js.setKnownHosts("C:\Users\user\.ssh\known_hosts");
Session session = js.getSession(username, host, port);
session.connect();
System.out.println("Connected");
} catch (JSchException e) {
e.printStackTrace();
}
}
@Pascal 建议将 strictHostKeyChecking
设置为 no
,这对我有用,但这不是首选解决方案。他首选的解决方案是从命令行使用 SSH,以便将主机添加到 known_hosts
文件中。我已经 Git 安装并执行 ssh -i openSSH_pair1\open_ssh_private vagrant@localhost -p 2200
并在提示输入密码和建立连接之前收到此输出
The authenticity of host '[localhost]:2200 ([127.0.0.1]:2200)' can't
be established. ECDSA key fingerprint is
11:5d:55:29:8a:77:d8:08:b4:00:9b:a3:61:93:fe:e5. Are you sure you want
to continue connecting (yes/no)? yes Warning: Permanently added
'[localhost]:2200' (ECDSA) to the list of known hosts.
所以现在 git_home\.ssh
中的 known_hosts
文件包含 localhost:2200
的条目,我还将 known_hosts
文件放入 user_home\.ssh
。我还将我的私钥放在我试图通过 ssh 进入的虚拟机上,然后 运行 生成一个 public 密钥并将其添加到 authorized_keys
ssh-keygen -y -f open_ssh_private > open_ssh_gen.pub
cat open_ssh_gen.pub >> ~/.ssh/authorized_keys
但是我仍然遇到这个异常
com.jcraft.jsch.JSchException: UnknownHostKey: localhost. RSA key fingerprint is 50:db:75:ba:11:2f:43:c9:ab:14:40:6d:7f:a1:ee:e3
at com.jcraft.jsch.Session.checkHost(Session.java:797)
at com.jcraft.jsch.Session.connect(Session.java:342)
at com.jcraft.jsch.Session.connect(Session.java:183)
at connect.Main.main(Main.java:24)
另一个问题的答案建议添加以下内容,这对我也不起作用
js.setKnownHosts("C:\Users\user\.ssh\known_hosts");
问题是您已将 ECDSA 主机密钥添加到 known_hosts
,因为 ssh
更喜欢该密钥类型:
ECDSA key fingerprint is 11:5d:55:29:8a:77:d8:08:b4:00:9b:a3:61:93:fe:e5.
但 JSch 更喜欢 RSA 密钥,它在 known_hosts
:
中找不到
RSA key fingerprint is 50:db:75:ba:11:2f:43:c9:ab:14:40:6d:7f:a1:ee:e3
您可能需要 JCE 才能在 JSch 中启用 ECDSA。
参见。
或者让 ssh
使用 RSA 密钥 -o HostKeyAlgorithms=ssh-rsa
。
参见 How can I force SSH to give an RSA key instead of ECDSA?
你也可以使用ssh-keyscan
:
ssh-keyscan -t rsa example.com
已经有两个关于此异常的问题:
- JSchException: UnknownHostKey 和
- com.jcraft.jsch.JSchException: UnknownHostKey
我正在使用 Windows 机器并尝试连接到使用 Vag运行t 运行 Ubuntu 创建的虚拟机。这是我的代码:
public static void main(String[] args) {
String host = "localhost";
String username = "vagrant";
int port = 2200;
String privateKey = "C:\keys\openSSH_pair1\open_ssh_private";
JSch js = new JSch();
try {
js.addIdentity(privateKey, "pass");
js.setKnownHosts("C:\Users\user\.ssh\known_hosts");
Session session = js.getSession(username, host, port);
session.connect();
System.out.println("Connected");
} catch (JSchException e) {
e.printStackTrace();
}
}
@Pascal 建议将 strictHostKeyChecking
设置为 no
,这对我有用,但这不是首选解决方案。他首选的解决方案是从命令行使用 SSH,以便将主机添加到 known_hosts
文件中。我已经 Git 安装并执行 ssh -i openSSH_pair1\open_ssh_private vagrant@localhost -p 2200
并在提示输入密码和建立连接之前收到此输出
The authenticity of host '[localhost]:2200 ([127.0.0.1]:2200)' can't be established. ECDSA key fingerprint is 11:5d:55:29:8a:77:d8:08:b4:00:9b:a3:61:93:fe:e5. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '[localhost]:2200' (ECDSA) to the list of known hosts.
所以现在 git_home\.ssh
中的 known_hosts
文件包含 localhost:2200
的条目,我还将 known_hosts
文件放入 user_home\.ssh
。我还将我的私钥放在我试图通过 ssh 进入的虚拟机上,然后 运行 生成一个 public 密钥并将其添加到 authorized_keys
ssh-keygen -y -f open_ssh_private > open_ssh_gen.pub
cat open_ssh_gen.pub >> ~/.ssh/authorized_keys
但是我仍然遇到这个异常
com.jcraft.jsch.JSchException: UnknownHostKey: localhost. RSA key fingerprint is 50:db:75:ba:11:2f:43:c9:ab:14:40:6d:7f:a1:ee:e3
at com.jcraft.jsch.Session.checkHost(Session.java:797)
at com.jcraft.jsch.Session.connect(Session.java:342)
at com.jcraft.jsch.Session.connect(Session.java:183)
at connect.Main.main(Main.java:24)
另一个问题的答案建议添加以下内容,这对我也不起作用
js.setKnownHosts("C:\Users\user\.ssh\known_hosts");
问题是您已将 ECDSA 主机密钥添加到 known_hosts
,因为 ssh
更喜欢该密钥类型:
ECDSA key fingerprint is 11:5d:55:29:8a:77:d8:08:b4:00:9b:a3:61:93:fe:e5.
但 JSch 更喜欢 RSA 密钥,它在 known_hosts
:
RSA key fingerprint is 50:db:75:ba:11:2f:43:c9:ab:14:40:6d:7f:a1:ee:e3
您可能需要 JCE 才能在 JSch 中启用 ECDSA。
参见
或者让 ssh
使用 RSA 密钥 -o HostKeyAlgorithms=ssh-rsa
。
参见 How can I force SSH to give an RSA key instead of ECDSA?
你也可以使用ssh-keyscan
:
ssh-keyscan -t rsa example.com