2015-09-29 13 views
9

Sto eseguendo un programma java in cui trasferisco un file da una cartella all'altra, utilizzando Java SFTP. Il problema che sto avendo è che sto ottenendo il seguente errore nel mio Java SFTP (usando JSch):Come risolvere Java UnknownHostKey, mentre si utilizza la libreria JSch SFTP?

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: \ Users \ ADMIN \ Downloads \ jsch-0.1.53.jar -Djavax.net.ssl .trustStore = C: \ Users \ IBM_AD ~ 1 \ AppData \ Local \ Temp \ trustStore5840796204189742395.jks FileTransfer com.jcraft.jsch.JSchException: UnknownHostKey: 127.0.0.1. L'impronta digitale della chiave RSA è a2: 39: 3: 44: 88: e9: 1f: d7: d1: 71: f4: 85: 98: fb: 90: dc in com.jcraft.jsch.Session.checkHost (Sessione. java: 797) a com.jcraft.jsch.Session.connect (Session.java:342) a com.jcraft.jsch.Session.connect (Session.java:183) a FileTransfer.main (FileTransfer.java: 33) processo terminato con codice di uscita 0.

Quello che segue è il mio codice finora:

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 

mio Cygwin è impostato, e ho controllato (con netstat -a -b) che sta funzionando.

risposta

14

Si sta tentando di saltare un controllo chiave host impostando StrictHostKeyChecking a no.

Ma è necessario farlo prima del controllo, ovvero prima dello session.connect().


In ogni caso, non dovresti mai farlo, a meno che non ti interessi della sicurezza. Il controllo della chiave host è lì per proteggerti da man-in-the-middle attacks.

Invece, impostare una chiave host prevista per consentire a JSch di verificarlo.

Ad esempio:

  • chiamata JSch.setKnownHosts fornendo un percorso di un file .ssh/known_hosts -come.

    Per generare il file simile a .ssh/known_hosts, è possibile utilizzare un comando ssh-keyscan da OpenSSH.Se ci si connette da un server * nix, si dovrebbe avere il comando a disposizione, basta eseguire

    ssh-keyscan example.com > known_hosts 
    

    Si avrà un formato simile:

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

    e di riferimento il known_hosts file generato nel codice JSch .

    Se si utilizza Windows, è possibile ottenere una versione di Windows di ssh-keyscan, da Win32-OpenSSH project o Git per Windows.

  • Chiama il numero JSch.getHostKeyRepository().add() per fornire la chiave host prevista (ad esempio hardcoded, come altre credenziali).

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

+0

Come faccio il passaggio "configura un codice host previsto per consentire a JSch di verificarlo". , grazie – Coffee

+1

Ho aggiunto un esempio per la generazione del file 'known_hosts'. –

+0

Ho provato a eseguire 'ssh-keyscan example.com> known_hosts' in Cygwin (su Windows), ma non sono sicuro di cosa fare dopo ... è stato scaricato sulla mia macchina? grazie – Coffee

1

A parte: con "Cygwin" presumo tu voglia dire sshd o sftpd, perché Cygwin stesso non fa SSH.

In ogni caso, se si vuole cliente JSch ad accettare qualsiasi tasto dall'host, spostare i .setConfig chiamate che imposta StrictHostKeyChecking no quindi è primasession.connect(). In alternativa, devi fornire l'accesso a un negozio che contiene le chiavi corrette per i tuoi host come spiegato da @Martin - e dovresti sempre farlo quando ci si connette a qualcosa di diverso da "localhost" o forse a una macchina sicura di essere presente lo stesso segmento di rete fisicamente sicuro (come un hub LAN cablato all'interno di una singola stanza).

+0

* "è necessario" *: Si prega di non suggerire a nessuno di non verificare la chiave dell'host SSH. Almeno non senza spiegare le conseguenze. È un terribile errore di sicurezza. –

+0

@Martin buon punto, aggiunto –

+0

che cosa è sftpd a proposito? – Coffee

Problemi correlati