Pregunta

Estoy tratando de utilizar JSCH para establecer una conexión SSH en Java. Mi código produce la siguiente excepción:

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

No puedo encontrar la forma de verificar la clave de host en la documentación JSCH. He incluido mi código a continuación.

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);
        } 
    }
}
¿Fue útil?

Solución

lo haría cualquiera:

  1. Trate de ssh desde la línea de comandos y aceptar la clave pública (se añadirá el anfitrión a ~/.ssh/known_hosts y todo debería funcionar bien después de JSCH) -O -
  2. Configurar JSch a no utilizar "StrictHostKeyChecking" (esto introduce inseguridades y sólo se debe utilizar para los propósitos de prueba), mediante el código siguiente:

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

La opción # 1 (añadiendo el host al archivo ~/.ssh/known_hosts) tiene mi preferencia.

Otros consejos

Es un riesgo de seguridad para evitar la comprobación de clave de host.

JSch utiliza la interfaz HostKeyRepository y su clase KnownHosts de aplicación por defecto para manejar esto. Puede proporcionar una implementación alternativa que permite teclas específicas mediante la implementación de HostKeyRepository. O usted podría guardar las claves que desea permitir en un archivo en el known_hosts formato y llamada

jsch.setKnownHosts(knownHostsFileName);

O con una cadena de clave pública de la siguiente manera.

String knownHostPublicKey = "mysite.com ecdsa-sha2-nistp256 AAAAE............/3vplY";
jsch.setKnownHosts(new ByteArrayInputStream(knownHostPublicKey.getBytes()));

ver Javadoc para más detalles.

Esta sería una solución más segura.

JSCH es de código abierto y se puede descargar desde la fuente aquí . En la carpeta de ejemplos, busque KnownHosts.java para saber más detalles.

Mientras que la pregunta ha sido contestada en general, me he encontrado que hay una caso cuando aún existente known_hosts ingreso no ayuda. Esto sucede cuando un servidor SSH envía ECDSA huella digital y, como resultado, tendrá una entrada como esta:

|1|+HASH=|HASH= ecdsa-sha2-nistp256 FINGERPRINT=

El problema es que JSch prefiere SHA_RSA y mientras se conecta a tratar de comparar la huella digital SHA-RSA, lo que dará lugar a error sobre "host desconocido".

Para solucionar este problema simplemente ejecute:

$ ssh-keyscan -H -t rsa example.org >> known_hosts

Jcraft sobre prefering SHA_RSA lugar de utilizar el local de HostKeyAlgorithms entorno, aunque no parecen ser demasiado ansiosos para corregir errores de su .

Dependiendo de qué programa se utiliza para ssh, la manera de obtener la clave adecuada podría variar. Masilla (popular entre Windows) utiliza su propio formato de claves SSH. Con la mayoría de las variantes de Linux y BSD que he visto, sólo tiene que mirar en ~/.ssh/known_hosts. Por lo general SSH desde una máquina Linux y luego copiar este archivo en una máquina Windows. Luego uso algo similar a

jsch.setKnownHosts("C:\\Users\\cabbott\\known_hosts");

Suponiendo que he colocado el archivo en C:\Users\cabbott en mi máquina de Windows. Si usted no tiene acceso a una máquina Linux, prueba a http://www.cygwin.com/

Tal vez alguien puede sugerir otra alternativa de Windows. Encuentro manera de manejar las claves SSH, almacenándolos en el Registro en un formato no estándar molestos para extraer de masilla.

proporcionar la clave RSA pública del anfitrión: -

String knownHostPublicKey = "mywebsite.com ssh-rsa AAAAB3NzaC1.....XL4Jpmp/";

session.setKnownHosts(new ByteArrayInputStream(knownHostPublicKey.getBytes()));

También puede ejecutar el siguiente código. Se prueba y de trabajo.

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.UIKeyboardInteractive;
import com.jcraft.jsch.UserInfo;

public class SFTPTest {

    public static void main(String[] args) {
        JSch jsch = new JSch();
        Session session = null;
        try {
            session = jsch.getSession("username", "mywebsite.com", 22); //default port is 22
            UserInfo ui = new MyUserInfo();
            session.setUserInfo(ui);
            session.setPassword("123456".getBytes());
            session.connect();
            Channel channel = session.openChannel("sftp");
            channel.connect();
            System.out.println("Connected");
        } catch (JSchException e) {
            e.printStackTrace(System.out);
        } catch (Exception e){
            e.printStackTrace(System.out);
        } finally{
            session.disconnect();
            System.out.println("Disconnected");
        }
    }

    public static class MyUserInfo implements UserInfo, UIKeyboardInteractive {

        @Override
        public String getPassphrase() {
            return null;
        }
        @Override
        public String getPassword() {
            return null;
        }
        @Override
        public boolean promptPassphrase(String arg0) {
            return false;
        }
        @Override
        public boolean promptPassword(String arg0) {
            return false;
        }
        @Override
        public boolean promptYesNo(String arg0) {
            return false;
        }
        @Override
        public void showMessage(String arg0) {
        }
        @Override
        public String[] promptKeyboardInteractive(String arg0, String arg1,
                String arg2, String[] arg3, boolean[] arg4) {
            return null;
        }
    }
}

Por favor, sustituir los valores apropiados.

También puede simplemente hacer

session.setConfig("StrictHostKeyChecking", "no");

No es seguro y lo que es una solución no conveniente para el ambiente en vivo, ya que desactivará globalmente conocido claves de host de cheques.

Sólo sustituir "usuario", "pase", "SSHD_IP". Y crear un archivo llamado known_hosts.txt con el contenido de ~ / .ssh / known_hosts del servidor. Obtendrá una concha.

public class Known_Hosts {
public static void main(String[] arg) {
    try {
        JSch jsch = new JSch();
        jsch.setKnownHosts("known_hosts.txt");
        Session session = jsch.getSession("user", "SSHD_IP", 22);
        session.setPassword("pass");
        session.connect();
        Channel channel = session.openChannel("shell");
        channel.setInputStream(System.in);
        channel.setOutputStream(System.out);
        channel.connect();
    } catch (Exception e) {
        System.out.println(e);
    }
  }
}

He perdido mucho tiempo en esta cuestión estúpida, y creo que el mensaje es del todo bien "no es el host en el archivo que estoy ingresar en" pero se puede tener más de un archivo know_host alrededor en su sistema ( como ejemplo estoy usando MobaXterm y mantener su propio dentro del directorio de instalación de montaje de la casa después de que la raíz).

Si usted está experimentando: que está funcionando desde la línea de comandos, pero no forma la aplicación intente acceder a su servidor remoto con ssh y comprobar con la opción -v verboso qué archivo se utiliza actualmente un ejemplo siguiente:

 ssh -v git@gitlab.com
 OpenSSH_6.2p2, OpenSSL 1.0.1g 7 Apr 2014
 debug1: Reading configuration data /etc/ssh_config
 debug1: Connecting to gitlab.com [104.210.2.228] port 22.
 debug1: Connection established.
 debug1: identity file /home/mobaxterm/.ssh/id_rsa type 1
 debug1: identity file /home/mobaxterm/.ssh/id_rsa-cert type -1
 debug1: identity file /home/mobaxterm/.ssh/id_dsa type -1
 debug1: identity file /home/mobaxterm/.ssh/id_dsa-cert type -1
 debug1: identity file /home/mobaxterm/.ssh/id_ecdsa type -1
 debug1: identity file /home/mobaxterm/.ssh/id_ecdsa-cert type -1
 debug1: Enabling compatibility mode for protocol 2.0
 debug1: Local version string SSH-2.0-OpenSSH_6.2
 debug1: Remote protocol version 2.0, remote software version OpenSSH_7.2p2      Ubuntu-4ubuntu2.1
 debug1: match: OpenSSH_7.2p2 Ubuntu-4ubuntu2.1 pat OpenSSH*
 debug1: SSH2_MSG_KEXINIT sent
 debug1: SSH2_MSG_KEXINIT received
 debug1: kex: server->client aes128-ctr hmac-sha1-etm@openssh.com zlib@openssh.com
 debug1: kex: client->server aes128-ctr hmac-sha1-etm@openssh.com zlib@openssh.com
 debug1: sending SSH2_MSG_KEX_ECDH_INIT
 debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
 debug1: Server host key: RSA b6:03:0e:39:97:9e:d0:e7:24:ce:a3:77:3e:01:42:09
 debug1: Host 'gitlab.com' is known and matches the RSA host key.
 debug1: Found key in /home/mobaxterm/.ssh/known_hosts:19
 debug1: ssh_rsa_verify: signature correct

como se puede ver la clave se encuentra en:

debug1: Found key in /home/mobaxterm/.ssh/known_hosts:19

y no en las ventanas de mi casa en C:.. \ Usuarios \ my_local_user \ ssh, simplemente les fusionaron y se alinean para resolver el problema

La esperanza esta ayuda alguien en el futuro

  

¿Alguien ha sido capaz de resolver este problema? Estoy usando JSCP a scp archivos utilizando la clave pública   autenticación (no quiero utilizar la autenticación de contraseña). Ayuda será apreciada !!!

Esta entrada stackoverflow es acerca de la comprobación de clave de host-y no hay ninguna relación con la autenticación de clave pública.

En cuanto a la autenticación de clave pública, probar el siguiente muestra con el plano (no cifrada) clave privada,

configuración de anfitrión conocido es mejor que el valor de configuración de impresión del fingure.

Cuando se establece anfitrión conocido, tratar de ssh de forma manual (primera vez, antes de que acabe la aplicación) de la caja se ejecuta la aplicación.

JSch jsch = new JSch();
Session session = null;
try {
session = jsch.getSession("user", "hostname", 22); // default
UserInfo ui = new MyUserInfo();
session.setUserInfo(ui);
session.setPassword("password".getBytes());
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
Channel channel = session.openChannel("sftp");
channel.connect();
System.out.println("Connected");
} catch (JSchException e) {
e.printStackTrace(System.out);
} catch (Exception e) {
e.printStackTrace(System.out);
} finally {
session.disconnect();
System.out.println("Disconnected");
}
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top