Frage

Ich versuche JSch zu verwenden, um eine SSH-Verbindung in Java zu etablieren. Mein Code erzeugt die folgende Ausnahme:

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

Ich kann nicht finden, wie der Host-Schlüssel in der JSch Dokumentation zu überprüfen. Ich habe meinen Code unten enthalten.

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);
        } 
    }
}
War es hilfreich?

Lösung

Ich würde entweder:

  1. Versuchen Sie von der Kommandozeile und nehmen die öffentlichen Schlüssel ssh (der Host sollte ~/.ssh/known_hosts und alles hinzugefügt werden dann von JSch gut funktionieren) OR -
  2. Configure JSch nicht verwenden "StrictHostKeyChecking" (dies stellt Unsicherheiten und soll nur zu Testzwecken verwendet werden), mit dem folgenden Code:

    java.util.Properties config = new java.util.Properties(); 
    config.put("StrictHostKeyChecking", "no");
    session.setConfig(config);
    

Option # 1 (Hinzufügen des Hosts zur ~/.ssh/known_hosts-Datei) hat meine Präferenz.

Andere Tipps

Es ist ein Sicherheitsrisiko Host-Schlüssel Prüfung zu vermeiden.

JSch verwendet HostKeyRepository Schnittstelle und deren Standardimplementierung knownhosts Klasse diese zu verwalten. Sie können eine alternative Implementierung zur Verfügung stellen, die durch die Implementierung HostKeyRepository spezifische Tasten ermöglicht. Oder Sie könnten die Schlüssel behalten, dass Sie in einer Datei im known_hosts Format und Anruf

jsch.setKnownHosts(knownHostsFileName);

oder mit einem öffentlichen Schlüssel String wie unten.

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

finden Sie unter hier . In den Beispielen Ordner, suchen Sie nach KnownHosts.java mehr Details kennen.

Während die Frage im Allgemeinen beantwortet wurde, habe ich mich gefunden, dass es eine Fall wenn auch bestehende known_hosts Eintrag hilft nicht. Dies geschieht, wenn ein SSH-Server sendet ECDSA Fingerabdruck und als Ergebnis erhalten Sie einen Eintrag wie folgt aussehen:

|1|+HASH=|HASH= ecdsa-sha2-nistp256 FINGERPRINT=

Das Problem ist, dass JSch vorzieht SHA_RSA und beim Herstellen der Verbindung wird es versuchen, SHA-RSA Fingerabdruck zu vergleichen, die über "unknown host" mit Fehlern führen werden.

Um dies zu beheben, führen Sie einfach:

$ ssh-keyscan -H -t rsa example.org >> known_hosts

oder beschweren Jcraft über SHA_RSA Bevorzugung des stattdessen die lokale verwenden HostKeyAlgorithms Einstellung, obwohl sie scheinen nicht zu sein, auch eifrig zu reparieren ihre Bugs .

Je nachdem, was Programm, das Sie für ssh verwenden, bekommen die Art und Weise der richtige Schlüssel variieren. Putty (beliebt bei Windows) verwendet ihr eigenes Format für SSH-Schlüssel. Bei den meisten Varianten von Linux und BSD, die ich gesehen habe, haben Sie gerade in ~/.ssh/known_hosts zu suchen. Ich ssh in der Regel von einer Linux-Maschine und dann diese Datei auf einem Windows-Rechner kopieren. Dann benutze ich etwas ähnliches wie

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

Unter der Annahme, ich die Datei in C:\Users\cabbott auf meinem Windows-Rechner gesetzt habe. Wenn Sie keinen Zugang zu einer Linux-Maschine haben, versuchen Sie http://www.cygwin.com/

Vielleicht kann jemand anderes eine andere Windows-Alternative vorschlagen. Ich finde Kitt Weg SSH-Schlüssel des Umgangs mit ihnen in der Registrierung in einem Nicht-Standard-Format störend empfunden zu extrahieren zu speichern.

Versorgen Sie den öffentlichen RSA-Schlüssel des Host: -

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

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

Sie können auch den folgenden Code ausführen. Es wird getestet und funktioniert.

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.com", 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;
        }
    }
}

Bitte ersetzen Sie die entsprechenden Werte ein.

Sie können auch einfach tun

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

Es ist nicht sicher, und es ist eine Abhilfe für Live-Umgebung nicht geeignet, da es global Host-Schlüssel Überprüfung bekannt deaktivieren wird.

Ersetzen Sie einfach "Benutzer", "pass", "SSHD_IP". Und eine Datei erstellen, mit dem Inhalt des Servers ~ / .ssh / known_hosts genannt known_hosts.txt. Sie erhalten eine Shell erhalten.

public class Known_Hosts {
public static void main(String[] arg) {
    try {
        JSch jsch = new JSch();
        jsch.setKnownHosts("known_hosts.txt");
        Session session = jsch.getSession("user", "SSHD_IP", 22);
        session.setPassword("pass");
        session.connect();
        Channel channel = session.openChannel("shell");
        channel.setInputStream(System.in);
        channel.setOutputStream(System.out);
        channel.connect();
    } catch (Exception e) {
        System.out.println(e);
    }
  }
}

ich viel Zeit auf diese dumme Frage verloren, und ich denke, die Botschaft ganz richtig ist: „Es ist nicht der Host in der Datei ich bin Zugriff“, aber Sie können mehr als eine know_host Datei haben um auf Ihrem System ( als Beispiel verwende ich MobaXterm und halten sie es in das Installationsverzeichnis der Montage des Hause aus dieser Wurzel) selbst ist.

Wenn Sie erleben: es funktioniert von Zeilenbefehl aber nicht bilden die Anwendung für den Zugriff auf Remote-Server mit ssh versuchen und überprüfen Sie mit ausführlicher Option -v die Datei zur Zeit ein Beispiel verwendet wird, folgendermaßen vor:

 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

, wie Sie die Taste sehen können, wurde gefunden:

debug1: Found key in /home/mobaxterm/.ssh/known_hosts:19

und nicht in meinem Fenster zu Hause unter C:.. \ Benutzer \ my_local_user \ ssh, ich sie einfach zusammengefügt und ausgerichtet, um das Problem zu lösen

Hope diese Hilfe jemand in Zukunft

  

Hat jemand in der Lage, dieses Problem zu lösen? Ich verwende Jscp Dateien scp öffentlichen Schlüssel   Authentifizierung (ich möchte nicht Passwort-Authentifizierung verwenden). Hilfe versteht sich !!!

Dieser Eintrag ist Stackoverflow über die Host-Key-Überprüfung, und es gibt in keinen Zusammenhang mit der öffentlichen Schlüssel-Authentifizierung.

Wie für die Authentifizierung über öffentliche Schlüssel, versuchen Sie die folgende Beispiel mit Ihre Ebene (non chiffrierten) private Schlüssel,

bekannte Host-Einstellung ist besser als fingure Druck Wert.

Wenn Sie bekannte Host gesetzt, versuchen, manuell ssh (erste Mal, vor der Anwendung ausgeführt wird) aus dem Feld, um die Anwendung ausgeführt wird.

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");
}
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top