我正在尝试使用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);
        }
    }
}

当前回答

JSch jsch = new JSch();
Session session = null;
try {
   session = jsch.getSession("user", "hostname", 22); // default
   UserInfo ui = new MyUserInfo();
   session.setUserInfo(ui);
   session.setPassword("password".getBytes());
   java.util.Properties config = new java.util.Properties();
   config.put("StrictHostKeyChecking", "no");
   session.setConfig(config);
   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");
}

其他回答

设置已知主机比设置指纹值更好。

当您设置已知主机时,尝试从应用程序运行的方框手动ssh(第一次,在应用程序运行之前)。

虽然这个问题大体上已经得到了回答,但我发现在某些情况下,即使现有的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设置,尽管他们似乎不太急于修复他们的错误。

有人能解决这个问题吗?我正在使用Jscp来scp文件使用公钥 认证(我不想使用密码认证)。感谢你的帮助!!

该stackoverflow表项主要用于检查主机密钥,与公钥认证无关。

至于公钥身份验证,请使用您的普通(非加密)私钥尝试以下示例,

我在@Jairo Martínez写的一个被删除的答案中找到了解决方案

首先,服务器需要将主机存储为哈希rsa

ssh-keyscan -H -t rsa SERVER_IP_ADDRESS >> known_hosts_file . sh

此外,还需要告诉Jsch主机密钥是散列的

session.setConfig(“HashKnownHosts”, “yes”);

根据ssh使用的程序,获取正确密钥的方式可能有所不同。Putty(在Windows中很流行)使用自己的ssh密钥格式。对于我见过的大多数Linux和BSD变体,您只需要在~/.ssh/known_hosts中查找即可。我通常从Linux机器上ssh,然后将这个文件复制到Windows机器上。然后我用类似的

jsch.setKnownHosts("C:\\Users\\cabbott\\known_hosts");

假设我已经将文件放在Windows计算机上的C:\Users\cabbott目录下。如果您无法访问Linux机器,请尝试http://www.cygwin.com/

也许其他人可以建议另一种Windows替代方案。我发现putty处理SSH密钥的方法是将它们以非标准格式存储在注册表中,难以提取。