¿Cómo resolver Java UnknownHostKey, al usar la biblioteca JSch SFTP?

Estoy ejecutando un progtwig Java donde transfiero un archivo de una carpeta a otra, usando Java SFTP. El problema que tengo es que obtengo el siguiente error en mi SFTP de Java (usando JSch):

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. La huella dactilar de la clave RSA es a2: 39: 3f: 44: 88: e9: 1f: d7: d1: 71: f4: 85: 98: fb: 90: dc en com.jcraft.jsch.Session.checkHost (Session.java: 797) en com.jcraft.jsch.Session.connect (Session.java:342) en com.jcraft.jsch.Session.connect (Session.java:183) en FileTransfer.main (FileTransfer.java:33) Proceso salido con código de salida 0.

El siguiente es mi código hasta ahora:

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 

Mi Cygwin está configurado y comprobé (con netstat -a -b ) que se está ejecutando.

Está intentando omitir una comprobación de clave de host estableciendo StrictHostKeyChecking en no .

Pero tienes que hacer eso antes de la comprobación, es decir, antes de la session.connect() .


De todos modos, nunca debes hacer esto, a menos que no te importe la seguridad. La verificación de la clave del host está ahí para protegerlo de los ataques de hombre en el medio .

En su lugar, configure una clave de host esperada para permitir que JSch la verifique.

Por ejemplo:

  • Llame a JSch.setKnownHosts proporcionando una ruta a un .ssh/known_hosts .

    Para generar el .ssh/known_hosts , puede usar un comando ssh-keyscan desde OpenSSH. Si se está conectando desde un servidor * nix, debe tener el comando disponible, solo ejecutar

     ssh-keyscan example.com > known_hosts 

    Tendrá un formato como:

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

    Y haga referencia al archivo known_hosts generado en su código JSch.

    Si está en Windows, puede obtener una comstackción de Windows de ssh-keyscan desde Win32-OpenSSH project o Git for Windows.

  • Llame a JSch.getHostKeyRepository().add() para proporcionar la clave de host esperada (p. Ej JSch.getHostKeyRepository().add() , como sus otras credenciales).

    Consulte Creación de la instancia de JSch HostKey desde una clave pública en formato .pub .

Aparte: por “Cygwin”, supongo que te refieres a sshd o sftpd, porque Cygwin en sí no hace SSH.

De todos modos, si desea que el cliente Jsch acepte cualquier clave del host, mueva las llamadas .setConfig que establecen StrictHostKeyChecking no por lo que es antes de session.connect() . Alternativamente, debe proporcionar acceso a una tienda que contenga la (s) clave (s) correcta (s) para su (s) host (es) como lo explica @Martin, y siempre debe hacerlo cuando se conecte a algo que no sea “localhost” o posiblemente una máquina que esté encendida. el mismo segmento de red físicamente seguro (como un concentrador LAN cableado dentro de una habitación individual).