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 manera de verificar la clave de host en la Jsch documentación. He incluido mi código de abajo.

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);
        } 
    }
}
InformationsquelleAutor Alex | 2010-01-05

12 Comentarios

  1. 211

    Yo ya sea:

    1. Intentar ssh desde la línea de comandos y aceptar la clave pública (el anfitrión será añadido a ~/.ssh/known_hosts y todo a funcionar bien desde Jsch) -O-
    2. Configurar JSch a no utilizar «StrictHostKeyChecking» (esto introduce inseguridades y deben ser utilizados solamente para propósitos de prueba), utilizando el código siguiente:

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

    Opción #1 (de agregar el host a la ~/.ssh/known_hosts archivo) tiene mi preferencia.

    • JSch#setConfig("StrictHostKeyChecking", "no") va a hacer el mismo trabajo, pero en una sola línea
    • Nota: he utilizado esta información para configurar mi ~/.ssh/config archivo para solucionar el error anterior cuando no tengo acceso a modificar el código fuente
    • Lo que le hiciste a tu .ssh/config? Estoy teniendo el mismo error.
    • Esto es inseguro y realmente no debería haber sido seleccionada como la respuesta correcta en ese principio. El setKnownHosts() y setFingerPrint() opciones son la manera de hacer esto sin dejar de lado un aspecto importante del proceso de ssh. Edit: en mi experiencia, #1 no funciona desde dentro de algunos entornos IDE como Eclipse.
    • Se hizo el trabajo para mí dentro de eclipse … justo lo que necesitaba en un entorno de prueba ….
    • Por favor, asegúrese de que está utilizando al menos la versión 0.1.53. Las versiones anteriores tienen problemas similares.
    • import static com.jcraft.jsch.JSch.setConfig; JSch.setConfig("StrictHostKeyChecking", "no");
    • He intentado esto, pero todavía no funciona, puede ayudar en esto?stackoverflow.com/questions/46766040/…

  2. 36

    Mientras que la pregunta ha sido respondida en general, me he encontrado que hay una caso cuando aún existente known_hosts entrada no ayuda. Esto ocurre cuando un servidor SSH envía ECDSA de huellas dactilares y, como resultado, usted tendrá una entrada como esta:

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

    El problema es que JSch prefiere SHA_RSA y mientras la conexión se va a tratar de comparar SHA-RSA de huellas dactilares, que con el resultado de error acerca de «desconocido».

    Para solucionar esto basta con ejecutar:

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

    o quejarse a Jcraft sobre prefiriendo SHA_RSA en lugar de utilizar el local HostKeyAlgorithms, a pesar de que no parecen ser demasiado con ganas para solucionar sus bugs.

    • Estamos en un caso similar, con ecdsa-sha2-nistp384, y su solución funciona muy bien. En consecuencia a openssh-keyscan manual, y de nuestra necesidad, nos ejecutar ssh-keyscan -t rsa,ecdsa example.org >> known_hosts.
    • He tenido un problema, pero la excepción fue JSchException: rechazar HostKey: en lugar de JSchException: UnknownHostKey (esto podría ayudar a algunos otros usuarios)
  3. 33

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

    JSch utiliza HostKeyRepository interfaz y su implementación predeterminada KnownHosts clase para manejar esto. Usted puede proporcionar una implementación alternativa que permite a teclas específicas mediante la implementación de HostKeyRepository. O usted podría mantener las teclas que desea permitir en un archivo en el known_hosts formato y llame a

    jsch.setKnownHosts(knownHostsFileName);

    O con una Cadena de clave pública como la de abajo.

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

    ver Javadoc para obtener más detalles.

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

    Jsch es de código abierto y se puede descargar el código fuente desde aquí. En la carpeta de ejemplos, buscar KnownHosts.java para conocer más detalles.

  4. 16

    Dependiendo de qué programa utilizar para ssh, la forma de obtener la clave adecuada podría variar. Masilla popular (con Windows) utiliza su propio formato de claves ssh. Con la mayoría de las variantes de Linux y BSD que he visto, sólo tienes que buscar en ~/.ssh/known_hosts. Yo generalmente ssh desde una máquina Linux y, a continuación, copie este archivo a una máquina Windows. Entonces yo uso algo similar a

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

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

    Tal vez alguien más puede sugerir otro Windows alternativa. Me parece masilla de la forma de manejo de claves SSH mediante el almacenamiento en el registro en un formato no estándar molestos para extraer.

    • En windows usingh ssh en cygwin (tienes que descargar el openssl de paquetes y dependencias) he sido capaz de descargar ~/.ssh/known_hosts. Gracias a @CharityAbbott.
  5. 10

    De suministro de la clave pública rsa de acogida :-

    String knownHostPublicKey = "mywebsite.com ssh-rsa AAAAB3NzaC1.....XL4Jpmp/";
    
    session.setKnownHosts(new ByteArrayInputStream(knownHostPublicKey.getBytes()));
    • No funciona para mí con jsch versión 0.1.50 (siempre tengo un NPE en jsch), pero con la versión más reciente 0.1.53 su trabajo.
    • será esto (de la Cadena.getBytes()) proporcionar una matriz de bytes de caracteres de codificado en unicode, cuando la Jsch código (Util.byte2str()) espera que la codificación UTF-8?
  6. 6

    También se puede ejecutar el siguiente código. Es probado y funcionando.

    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.

    • setFingerprint método no encontrado…
    • Sí, yo había añadido que para mi referencia. Voy a quitar eso. Gracias.
    • esto creó algún tipo de extraño auth problemas al conectarse a ciertos Servidores SSH oferta de teclado interactivo método de autenticación. Yo lo he utilizado durante años para deshacerse de la Clave y, a continuación, se quemó hoy mismo con un determinado servidor. Porque yo no suministrado el MP a través de getPassword (), sino directamente con el objeto de Sesión. Mantenga esto en mente. Yo no usarlo nunca más.
  7. 6

    También puede simplemente hacer

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

    No es seguro y es una solución no apto para vivir en la medida que ésta va a deshabilitar globalmente conocido las claves de host de cheques.

    • Mientras que este código puede ayudar a responder la pregunta, sólo el código de respuestas no son de alta calidad. Una mejor respuesta a explicar lo que hace el código, saber dónde insertarlo, explicar por qué este enfoque fue adoptado, y el enlace a la documentación pertinente.
  8. 1

    Acaba de sustituir a «usuario», «contraseña», «SSHD_IP». Y crear un archivo llamado known_hosts.txt con el contenido del servidor ~/.ssh/known_hosts. Usted va a obtener una shell.

    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);
    }
    }
    }
    • Nope no funciona para mí. Del mismo modo, Eric Leschinski/Rakesh Acharya de la respuesta de la falla si me comente config.put("StrictHostKeyChecking", "no"); Un manual de ssh -v conexión revela la .ssh/known_hosts archivo contiene la clave (ecdsa-sha2-nistp256) pero el código que hace esto: com.jcraft.jsch.JSchException: UnknownHostKey: 131.132.x.x. RSA key fingerprint is c2:... at com.jcraft.jsch.Session.checkHost(Session.java:805) at com.jcraft.jsch.Session.connect(Session.java:345)
    • Hace algún tiempo, lo que me gustaría probar de hacer, es el uso de la JSCH de la biblioteca de la versión disponible en 13 de junio de 2013, de hacer que las cosas probablemente cambió en la biblioteca desde entonces
  9. 1

    configuración de host conocido es mejor que la configuración de fingure impresión de valor.

    Cuando se establece host conocido, tratar de forma manual ssh (primer tiempo, antes de la aplicación se ejecuta) de la caja se ejecuta la aplicación.

  10. 1

    He perdido un montón de tiempo en este estúpido problema, y creo que el mensaje es bastante derecho «no es el host en el archivo que estoy acceso», pero usted puede tener más de un know_host de archivos de todo el sistema (por ejemplo yo estoy usando mobaXterm y mantener su propio dentro del directorio de instalación montaje de la casa de la raíz).

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

     ssh -v [email protected].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-[email protected].com [email protected].com
    debug1: kex: client->server aes128-ctr hmac-sha1-[email protected].com [email protected].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 puedes ver, la clave se encuentra en :

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

    y no en mi casa bajo windows C:\Users\my_local_user\.ssh , yo simplemente fusionaron y alineados para resolver el problema.

    Espero que esto ayude a alguien en el futuro

  11. 0

    Nadie ha sido capaz de resolver este problema? Estoy usando Jscp a scp archivos mediante clave pública
    autenticación (no quiero usar la autenticación por contraseña). La ayuda será apreciada!!!

    Este stackoverflow entrada es acerca de la acogida de clave de control, y no hay ninguna relación con la autenticación de clave pública.

    Como para la autenticación de clave pública, pruebe el siguiente ejemplo con su llanura(no cifrado) la clave privada,

  12. 0
    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");
    }
    }

Dejar respuesta

Please enter your comment!
Please enter your name here