我正在尝试使用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);
}
}
}
我在这个愚蠢的问题上浪费了很多时间,我认为消息是非常正确的“在我正在访问的文件中没有主机”,但你可以在你的系统上有更多的know_host文件(例如,我使用mobaXterm,它保持它自己在安装目录中从根挂载home)。
如果你遇到:它从命令行工作,而不是从应用程序尝试访问您的远程服务器ssh和检查verbose -v选项当前使用的文件,示例如下:
ssh -v git@gitlab.com
OpenSSH_6.2p2, OpenSSL 1.0.1g 7 Apr 2014
debug1: Reading configuration data /etc/ssh_config
debug1: Connecting to gitlab.com [104.210.2.228] port 22.
debug1: Connection established.
debug1: identity file /home/mobaxterm/.ssh/id_rsa type 1
debug1: identity file /home/mobaxterm/.ssh/id_rsa-cert type -1
debug1: identity file /home/mobaxterm/.ssh/id_dsa type -1
debug1: identity file /home/mobaxterm/.ssh/id_dsa-cert type -1
debug1: identity file /home/mobaxterm/.ssh/id_ecdsa type -1
debug1: identity file /home/mobaxterm/.ssh/id_ecdsa-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_6.2
debug1: Remote protocol version 2.0, remote software version OpenSSH_7.2p2 Ubuntu-4ubuntu2.1
debug1: match: OpenSSH_7.2p2 Ubuntu-4ubuntu2.1 pat OpenSSH*
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-sha1-etm@openssh.com zlib@openssh.com
debug1: kex: client->server aes128-ctr hmac-sha1-etm@openssh.com zlib@openssh.com
debug1: sending SSH2_MSG_KEX_ECDH_INIT
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug1: Server host key: RSA b6:03:0e:39:97:9e:d0:e7:24:ce:a3:77:3e:01:42:09
debug1: Host 'gitlab.com' is known and matches the RSA host key.
debug1: Found key in /home/mobaxterm/.ssh/known_hosts:19
debug1: ssh_rsa_verify: signature correct
如你所见,钥匙是在:
debug1: Found key in /home/mobaxterm/.ssh/known_hosts:19
而不是在我的windows home下C:\Users\my_local_user\。SSH,我只是将它们合并并对齐以解决问题。
希望这对将来的人有所帮助
避免主机密钥检查存在安全风险。
JSch使用HostKeyRepository接口和它的默认实现KnownHosts类来管理它。您可以通过实现HostKeyRepository提供允许特定密钥的替代实现。或者您可以将希望允许的键保存在known_hosts格式的文件中并调用
jsch.setKnownHosts(knownHostsFileName);
或使用公钥字符串,如下所示。
String knownHostPublicKey = "mysite.example ecdsa-sha2-nistp256 AAAAE............/3vplY";
jsch.setKnownHosts(new ByteArrayInputStream(knownHostPublicKey.getBytes()));
有关更多细节,请参阅Javadoc。
这将是一个更安全的解决方案。
Jsch是开源的,您可以从这里下载源代码。在示例文件夹中,查找KnownHosts.java以了解更多细节。