¿Cómo resolver Java UnknownHostKey, mientras se usa la biblioteca JSch SFTP?
ssh public-key (3)
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 establece
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 (s) como explica @Martin, y siempre debe hacerlo cuando se conecte a algo que no sea "localhost" o posiblemente una máquina que seguramente esté encendida el mismo segmento de red físicamente seguro (como un hub LAN alámbrico dentro de una habitación individual).
Estoy ejecutando un programa java donde transfiero un archivo de una carpeta a otra, usando Java SFTP. El problema que tengo es que recibo el siguiente error en mi Java SFTP (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 digital 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 verifiqué (con
netstat -a -b
) que se está ejecutando.
Está intentando omitir una comprobación de clave de host estableciendo
StrictHostKeyChecking
en
no
.
Pero debe hacerlo antes de la comprobación, es decir, antes de la
session.connect()
.
De todos modos, nunca debe hacer esto, a menos que no le importe la seguridad. La comprobación de la clave del host está ahí para protegerlo de 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 archivo similar a.ssh/known_hosts
.Para generar el archivo similar a
.ssh/known_hosts
, puede usar un comandossh-keyscan
de OpenSSH. Si se conecta desde un servidor * nix, debe tener el comando disponible, solo ejecutessh-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 compilación de Windows de
ssh-keyscan
del proyecto Win32-OpenSSH o Git para Windows. -
Llame a
JSch.getHostKeyRepository().add()
para proporcionar la clave de host esperada (por ejemplo, codificada, como sus otras credenciales).Consulte Crear una instancia de JSch HostKey a partir de una clave pública en formato .pub .
versión jsch: 0.1.55
mi problema resuelto ejecutando:
ssh-keyscan -t rsa <HOST_NAME> >> ~/.ssh/known_hosts
ssh-keyscan -t rsa <IP_ADDRESS_OF_HOST_NAME> >> ~/.ssh/known_hosts
** en mi caso, jsch estaba buscando la dirección IP en el archivo conocido_hosts
jsch.setKnownHosts(System.getProperty("user.home")+"/.ssh/known_hosts");