2015-09-29 8 views
9

Ich führe ein Java-Programm, wo ich eine Datei von einem Ordner auf einen anderen übertragen, mit Java SFTP. Das Problem, das ich habe ist, dass ich den folgenden Fehler in meinem Java SFTP bekommen (mit JSch):Wie Java UnknownHostKey zu lösen, während JSch SFTP-Bibliothek verwenden?

C: \ Oracle \ Middleware \ Oracle_Home \ oracle_common \ jdk \ bin \ javaw.exe - server -classpath C: \ JDeveloper \ mywork \ Java_Hello_World.adf; C: \ JDeveloper \ mywork \ Java_Hello_World \ Client \ classes; C: \ Benutzer \ ADMIN \ Downloads \ jsch-0.1.53.jar -Djavax.net.ssl .trustStore = C: \ Benutzer \ IBM_AD ~ 1 \ AppData \ Lokal \ Temp \ trustStore5840796204189742395.jks FileTransfer com.jcraft.jsch.JSchException: UnknownHostKey: 127.0.0.1. RSA Schlüssel Fingerabdruck ist a2: 39: 3f: 44: 88: e9: 1f: d7: d1: 71: f4: 85: 98: fb: 90: dc bei com.jcraft.jsch.Session.checkHost (Sitzung. java: 797) um com.jcraft.jsch.Session.connect (Session.java:342) um com.jcraft.jsch.Session.connect (Session.java:183) um FileTransfer.main (FileTransfer.java: 33) Prozess beendet mit Exit-Code 0.

Das folgende ist mein Code so weit:

FileTransfer fileTransfer = new FileTransfer();    

JSch jsch = new JSch(); 

try { 

    String host = "127.0.0.1"; 
    int port = 22; 

    String user = "user"; 
    Session session = jsch.getSession(user, host, port);  
    session = jsch.getSession("username", "127.0.0.1", 22); 
    session.connect(); // bug here , java.net.ConnectException 

    ChannelSftp sftp = null; 
    sftp = (ChannelSftp)session.openChannel("sftp") ; //channel; 

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

    sftp.rename("C:\\Users\\ADMIN\\Desktop\\Work\\ConnectOne_Bancorp\\Java_Work\\SFTP_1\\house.bmp", "C:\\Users\\ADMIN\\Desktop\\Work\\ConnectOne_Bancorp\\Java_Work\\SFTP_2\\house.bmp"); 
    session.disconnect(); 

} catch (JSchException e) { 
    e.printStackTrace(); 
} catch (SftpException e) { 
    e.printStackTrace(); 
} //end-catch 

Mein Cygwin eingerichtet ist, und ich überprüft (mit netstat -a -b) dass es läuft.

Antwort

14

Sie versuchen, eine Host-Schlüsselüberprüfung zu überspringen, indem Sie StrictHostKeyChecking auf no setzen.

Aber Sie müssen das vor der Überprüfung tun, d. H. Vor der session.connect().


Wie auch immer, Sie sollten dies nie tun, es sei denn, Sie kümmern sich nicht um die Sicherheit. Die Überprüfung des Hostschlüssels dient dazu, Sie vor man-in-the-middle attacks zu schützen.

Richten Sie stattdessen einen erwarteten Hostschlüssel ein, damit JSch ihn verifizieren kann.

Zum Beispiel:

  • Anruf JSch.setKnownHosts einen Pfad zu einer .ssh/known_hosts -ähnlichen Datei bereitstellt.

    Um die Datei .ssh/known_hosts zu erzeugen, können Sie einen Befehl ssh-keyscan von OpenSSH verwenden.Wenn Sie von einem * nix-Server verbunden sind, sollten Sie den Befehl zur Verfügung haben, nur

    ssh-keyscan example.com > known_hosts 
    

    Sicht wird es ein Format haben wie:

    example.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA0hVqZOvZ7yWgie9OHdTORJVI5fJJoH1yEGamAd5G3werH0z7e9ybtq1mGUeRkJtea7bzru0ISR0EZ9HIONoGYrDmI7S+BiwpDBUKjva4mAsvzzvsy6Ogy/apkxm6Kbcml8u4wjxaOw3NKzKqeBvR3pc+nQVA+SJUZq8D2XBRd4EDUFXeLzwqwen9G7gSLGB1hJkSuRtGRfOHbLUuCKNR8RV82i3JvlSnAwb3MwN0m3WGdlJA8J+5YAg4e6JgSKrsCObZK7W1R6iuyuH1zA+dtAHyDyYVHB4FnYZPL0hgz2PSb9c+iDEiFcT/lT4/dQ+kRW6DYn66lS8peS8zCJ9CSQ== 
    

    und die erzeugte known_hosts-Datei in Ihrem JSch Code verweisen .

    Wenn Sie unter Windows sind, können Sie einen Windows-Build von ssh-keyscan, von Win32-OpenSSH project oder Git für Windows erhalten.

  • Anruf JSch.getHostKeyRepository().add() den erwarteten Host-Schlüssel (zum Beispiel hartcodiert, wie Ihre andere Anmeldeinformationen) zur Verfügung zu stellen.

    Siehe Creating JSch HostKey instance from a public key in .pub format.

+0

Wie mache ich den Schritt "richten Sie einen erwarteten Host-Schlüssel ein, damit JSch es verifizieren kann." , danke – Coffee

+1

Ich habe ein Beispiel hinzugefügt, um die Datei 'known_hosts' zu erzeugen. –

+0

ich versuchte mit 'ssh-keyscan example.com> known_hosts' in Cygwin (unter Windows), aber ich bin mir nicht sicher, was als nächstes zu tun hier .. ist es auf meinem Rechner heruntergeladen? Danke – Coffee

1

Beiseite: von "Cygwin" Ich nehme an, du meinst sshd oder sftpd, weil Cygwin selbst SSH nicht macht.

Wie auch immer, wenn Sie JSch Kunde möchte eine beliebige Taste von dem Host zu übernehmen, bewegen Sie die .setConfig Anrufe, die StrictHostKeyChecking no setzt so ist es vorsession.connect(). Alternativ müssen Sie Zugang zu einem Geschäft bereitstellen, das den richtigen Schlüssel für Ihre Hosts enthält, wie @Martin erklärt - und Sie sollten das immer tun, wenn Sie sich mit etwas anderem als "localhost" oder einem Computer verbinden, der sicher eingeschaltet ist das gleiche, physikalisch sichere Netzwerksegment (z. B. ein kabelgebundener LAN-Hub in einem einzelnen Raum).

+0

* „Sie müssen“ *: Bitte machen Sie niemanden nicht den SSH-Host-Schlüssel zu überprüfen. Zumindest nicht ohne die Konsequenzen zu erklären. Es ist ein schrecklicher Sicherheitsfehler. –

+0

@ Martin guter Punkt, hinzugefügt –

+0

was übrigens sftpd ist? – Coffee

Verwandte Themen