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

当前回答

你也可以简单地做

session.setConfig("StrictHostKeyChecking", "no");

这是不安全的,它是一个不适合现场环境的解决方案,因为它将禁用全局已知的主机密钥检查。

其他回答

您还可以执行以下代码。它已经过测试并正在工作。

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;
        }
    }
}

请代入适当的值。

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

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

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

提供主机的rsa公钥:—

String knownHostPublicKey = "mywebsite.example ssh-rsa AAAAB3NzaC1.....XL4Jpmp/";

session.setKnownHosts(new ByteArrayInputStream(knownHostPublicKey.getBytes()));

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

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

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

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

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

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

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