Ich versuche, mit Jsch eine SSH-Verbindung in Java herzustellen. 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 in der Jsch-Dokumentation nicht finden, wie der Hostschlüssel überprüft werden kann. Ich habe meinen Code unten angegeben.
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);
}
}
}
Antworten:
Ich würde entweder:
ssh
über die Befehlszeile und akzeptieren Sie den öffentlichen Schlüssel (der Host wird hinzugefügt~/.ssh/known_hosts
und alles sollte dann von Jsch aus einwandfrei funktionieren) -OR-Konfigurieren Sie JSch so, dass "StrictHostKeyChecking" nicht verwendet wird (dies führt zu Unsicherheiten und sollte nur zu Testzwecken verwendet werden). Verwenden Sie dazu den folgenden Code:
Option 1 (Hinzufügen des Hosts zur
~/.ssh/known_hosts
Datei) hat meine Präferenz.quelle
JSch#setConfig("StrictHostKeyChecking", "no")
wird den gleichen Job machen, aber in nur einer Zeile~/.ssh/config
Datei so zu konfigurieren , dass der obige FehlerObwohl die Frage im Allgemeinen beantwortet wurde, habe ich festgestellt, dass es einen Fall gibt, in dem selbst der vorhandene Eintrag " unknown_hosts" nicht hilft. Dies geschieht, wenn ein SSH-Server einen ECDSA-Fingerabdruck sendet und Sie daher einen Eintrag wie den folgenden haben:
Das Problem ist, dass JSch SHA_RSA bevorzugt und beim Verbinden versucht, den SHA-RSA-Fingerabdruck zu vergleichen, was zu einem Fehler bezüglich "unbekannter Host" führt.
Um dies zu beheben, führen Sie einfach Folgendes aus:
oder beschweren Sie sich bei Jcraft darüber , dass Sie SHA_RSA bevorzugen, anstatt die lokale HostKeyAlgorithms- Einstellung zu verwenden, obwohl sie nicht zu eifrig zu sein scheinen, ihre Fehler zu beheben .
quelle
ecdsa-sha2-nistp384
und Ihre Lösung funktioniert sehr gut. Entsprechend dem Handbuch openssh-keyscan und unserem Bedarf laufen wirssh-keyscan -t rsa,ecdsa example.org >> known_hosts
.Es ist ein Sicherheitsrisiko, die Überprüfung des Hostschlüssels zu vermeiden.
JSch verwendet die HostKeyRepository-Schnittstelle und die KnownHosts-Klasse für die Standardimplementierung, um dies zu verwalten. Sie können eine alternative Implementierung bereitstellen, die bestimmte Schlüssel zulässt, indem Sie HostKeyRepository implementieren. Oder Sie können die Schlüssel, die Sie zulassen möchten, in einer Datei im Format unknown_hosts behalten und aufrufen
Oder mit einem öffentlichen Schlüssel String wie unten.
Weitere Informationen finden Sie in Javadoc .
Dies wäre eine sicherere Lösung.
Jsch ist Open Source und Sie können die Quelle hier herunterladen . Suchen Sie im Beispielordner nach KnownHosts.java, um weitere Details zu erfahren.
quelle
Je nachdem, welches Programm Sie für ssh verwenden, kann der Weg zum richtigen Schlüssel variieren. Putty (beliebt bei Windows) verwendet ein eigenes Format für SSH-Schlüssel. Bei den meisten Varianten von Linux und BSD, die ich gesehen habe, muss man nur nachsehen
~/.ssh/known_hosts
. Normalerweise ssh ich von einem Linux-Computer und kopiere diese Datei dann auf einen Windows-Computer. Dann benutze ich etwas ähnliches wieAngenommen, ich habe die Datei
C:\Users\cabbott
auf meinem Windows-Computer abgelegt . Wenn Sie keinen Zugriff auf einen Linux-Computer haben, versuchen Sie es unter http://www.cygwin.com/.Vielleicht kann jemand anderes eine andere Windows-Alternative vorschlagen. Ich finde die Art und Weise, wie Putty mit SSH-Schlüsseln umgeht, indem ich sie in einem nicht standardmäßigen Format in der Registrierung speichere, mühsam zu extrahieren.
quelle
cygwin
(Sie müssen dasopenssl
Paket und die Abhängigkeiten herunterladen ) konnte ich herunterladen~/.ssh/known_hosts
. Vielen Dank an @CharityAbbott.Geben Sie den öffentlichen RSA-Schlüssel des Hosts an: -
quelle
Sie können auch einfach tun
Es ist nicht sicher und eine Problemumgehung, die nicht für Live-Umgebungen geeignet ist, da dadurch die weltweit bekannte Überprüfung von Hostschlüsseln deaktiviert wird.
quelle
Sie können auch den folgenden Code ausführen. Es ist getestet und funktioniert.
Bitte ersetzen Sie die entsprechenden Werte.
quelle
Ersetzen Sie einfach "Benutzer", "Pass", "SSHD_IP". Erstellen Sie eine Datei mit dem Namen unknown_hosts.txt mit dem Inhalt der ~ / .ssh / unknown_hosts des Servers. Sie erhalten eine Muschel.
quelle
config.put("StrictHostKeyChecking", "no");
Eine manuellessh -v
Verbindung zeigt, dass die.ssh/known_hosts
Datei den Schlüssel (ecdsa-sha2-nistp256
) enthält, aber der Code tut dies:com.jcraft.jsch.JSchException: UnknownHostKey: 131.132.x.x. RSA key fingerprint is c2:...
at com.jcraft.jsch.Session.checkHost(Session.java:805)
at com.jcraft.jsch.Session.connect(Session.java:345)
Das Einstellen des bekannten Hosts ist besser als das Einstellen des Fingerabdruckwerts.
Wenn Sie einen bekannten Host festlegen, versuchen Sie, ssh (zum ersten Mal, bevor die Anwendung ausgeführt wird) manuell über das Feld zu aktivieren, in dem die Anwendung ausgeführt wird.
quelle
Ich habe viel Zeit mit diesem dummen Problem verloren, und ich denke, die Nachricht ist ganz richtig "Es gibt nicht den Host in der Datei, auf die ich zugreife", aber Sie können mehr als eine know_host-Datei auf Ihrem System haben (als Beispiel i Ich verwende mobaXterm und es bleibt im Installationsverzeichnis, in dem sich das Home von diesem Stamm aus befindet.
Wenn Folgendes auftritt: Es funktioniert über die Befehlszeile, aber nicht über die Anwendung. Versuchen Sie, mit ssh auf Ihren Remote-Server zuzugreifen, und überprüfen Sie mit der Option verbose -v, welche Datei derzeit verwendet wird.
Wie Sie sehen können, wurde der Schlüssel gefunden in:
und nicht in meinem Windows-Home unter C: \ Users \ my_local_user \ .ssh, ich habe sie einfach zusammengeführt und ausgerichtet, um das Problem zu lösen.
Hoffe das hilft jemandem in Zukunft
quelle
Bei diesem Stackoverflow-Eintrag geht es um die Überprüfung des Hostschlüssels, und es besteht keine Beziehung zur Authentifizierung mit öffentlichem Schlüssel.
Versuchen Sie für die Authentifizierung mit öffentlichem Schlüssel das folgende Beispiel mit Ihrem einfachen (nicht verschlüsselten) privaten Schlüssel:
quelle
quelle