我正在尝试使用Jsch在Java中建立SSH连接。我的代码产生以下异常:
com.jcraft.jsch.JSchException: UnknownHostKey: mywebsite.example.
RSA key fingerprint is 22:fb:ee:fe:18:cd:aa:9a:9c:78:89:9f:b4:78:75:b4
我找不到如何在Jsch文档中验证主机密钥。下面是我的代码。
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
public class ssh {
public static void main(String[] arg) {
try {
JSch jsch = new JSch();
//create SSH connection
String host = "mywebsite.example";
String user = "username";
String password = "123456";
Session session = jsch.getSession(user, host, 22);
session.setPassword(password);
session.connect();
} catch(Exception e) {
System.out.println(e);
}
}
}
您还可以执行以下代码。它已经过测试并正在工作。
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.UIKeyboardInteractive;
import com.jcraft.jsch.UserInfo;
public class SFTPTest {
public static void main(String[] args) {
JSch jsch = new JSch();
Session session = null;
try {
session = jsch.getSession("username", "mywebsite.example", 22); //default port is 22
UserInfo ui = new MyUserInfo();
session.setUserInfo(ui);
session.setPassword("123456".getBytes());
session.connect();
Channel channel = session.openChannel("sftp");
channel.connect();
System.out.println("Connected");
} catch (JSchException e) {
e.printStackTrace(System.out);
} catch (Exception e){
e.printStackTrace(System.out);
} finally{
session.disconnect();
System.out.println("Disconnected");
}
}
public static class MyUserInfo implements UserInfo, UIKeyboardInteractive {
@Override
public String getPassphrase() {
return null;
}
@Override
public String getPassword() {
return null;
}
@Override
public boolean promptPassphrase(String arg0) {
return false;
}
@Override
public boolean promptPassword(String arg0) {
return false;
}
@Override
public boolean promptYesNo(String arg0) {
return false;
}
@Override
public void showMessage(String arg0) {
}
@Override
public String[] promptKeyboardInteractive(String arg0, String arg1,
String arg2, String[] arg3, boolean[] arg4) {
return null;
}
}
}
请代入适当的值。
虽然这个问题大体上已经得到了回答,但我发现在某些情况下,即使现有的known_hosts条目也无济于事。这发生在SSH服务器发送ECDSA指纹时,结果,你会有这样的条目:
|1|+HASH=|HASH= ecdsa-sha2-nistp256 FINGERPRINT=
问题是JSch更喜欢SHA_RSA,在连接时将尝试比较SHA-RSA指纹,这将导致关于“未知主机”的错误。
要解决这个问题,只需运行:
$ ssh-keyscan -H -t rsa example.org >> known_hosts
或者向Jcraft抱怨更喜欢SHA_RSA而不是使用本地HostKeyAlgorithms设置,尽管他们似乎不太急于修复他们的错误。