com.jcraft.jsch.JSchException:UnknownHostKey

问题

我正在尝试使用Jsch在Java中建立SSH连接。我的代码产生以下异常:

com.jcraft.jsch.JSchException: UnknownHostKey: mywebsite.com. 
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.com";
            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);
        } 
    }
}

#1 热门回答(179 赞)

我要么:

  • 尝试从命令行ssh并接受公钥(主机将被添加到〜/ .ssh / known_hosts,然后一切都应该从Jsch正常工作) - 或 -
  • 使用以下代码将JSch配置为不使用"StrictHostKeyChecking"(这会引入不安全因素并且只应用于测试目的):java.util.Properties config = new java.util.Properties();
    config.put("StrictHostKeyChecking","no");
    session.setConfig(配置);

选项#1(将主机添加到299985075文件)有我的偏好。


#2 热门回答(23 赞)

避免主机密钥检查是一种安全风险。

JSch使用HostKeyRepository接口及其默认实现KnownHosts类来管理它。你可以通过实现HostKeyRepository来提供允许特定键的备用实现。或者,你可以在known_hosts format中保留要允许的密钥并调用

jsch.setKnownHosts(knownHostsFileName);

或者使用如下的公钥String。

String knownHostPublicKey = "mysite.com ecdsa-sha2-nistp256 AAAAE............/3vplY";
jsch.setKnownHosts(new ByteArrayInputStream(knownHostPublicKey.getBytes()));

有关详细信息,请参阅Javadoc

这将是一个更安全的解决方案。

Jsch是开源的,你可以从here下载源代码。在示例文件夹中,查找KnownHosts.java以了解更多详细信息。


#3 热门回答(17 赞)

虽然这个问题已经得到了解答,但我发现自己有一个acase,即使现有的known_hostsentry也无济于事。当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而不是使用localHostKeyAlgorithmssetting,尽管他们似乎并没有太多来修复他们的bugs