2011-10-26 15 views
5

Actualmente tengo una aplicación de Android que se conecta a mi enrutador a través de ssh usando una contraseña. Estoy buscando mejorar esto para poder usar claves, pero estoy teniendo problemas reales. Por lo que entiendo, la versión de bouncycastle incluida con Android es una versión paralizada y debido a esto, las claves ssh no funcionan con jsch. He visto Spongycastle, que dice ser una implementación más completa. Debajo está el resultado que es básicamente lo mismo que usar bouncycastle, Auth Fail.Jsch con spongycastle en lugar de bouncycastle en Android


10-26 18:18:23.528: INFO/System.out(10642): Log(jsch,1): Connecting to 192.168.88.1 port 22 
10-26 18:18:23.538: INFO/System.out(10642): Log(jsch,1): Connection established 
10-26 18:18:23.548: INFO/System.out(10642): Log(jsch,1): Remote version string: SSH-2.0-ROSSSH 
10-26 18:18:23.548: INFO/System.out(10642): Log(jsch,1): Local version string: SSH-2.0-JSCH-0.1.44 
10-26 18:18:23.548: INFO/System.out(10642): Log(jsch,1): CheckCiphers: aes256-ctr,aes192-ctr,aes128-ctr,aes256-cbc,aes192-cbc,aes128-cbc,3des-ctr,arcfour,arcfour128,arcfour256 
10-26 18:18:23.618: INFO/System.out(10642): Log(jsch,1): SSH_MSG_KEXINIT sent 
10-26 18:18:23.618: INFO/System.out(10642): Log(jsch,1): SSH_MSG_KEXINIT received 
10-26 18:18:23.628: INFO/System.out(10642): Log(jsch,1): kex: server->client aes128-cbc hmac-md5 none 
10-26 18:18:23.628: INFO/System.out(10642): Log(jsch,1): kex: client->server aes128-cbc hmac-md5 none 
10-26 18:18:23.688: INFO/System.out(10642): Log(jsch,1): SSH_MSG_KEXDH_INIT sent 
10-26 18:18:23.688: INFO/System.out(10642): Log(jsch,1): expecting SSH_MSG_KEXDH_REPLY 
10-26 18:18:24.058: INFO/System.out(10642): Log(jsch,1): ssh_dss_verify: signature true 
10-26 18:18:24.058: INFO/System.out(10642): Log(jsch,2): Permanently added '192.168.88.1' (DSA) to the list of known hosts. 
10-26 18:18:24.058: INFO/System.out(10642): Log(jsch,1): SSH_MSG_NEWKEYS sent 
10-26 18:18:24.058: INFO/System.out(10642): Log(jsch,1): SSH_MSG_NEWKEYS received 
10-26 18:18:24.078: INFO/System.out(10642): Log(jsch,1): SSH_MSG_SERVICE_REQUEST sent 
10-26 18:18:24.088: INFO/System.out(10642): Log(jsch,1): SSH_MSG_SERVICE_ACCEPT received 
10-26 18:18:24.108: INFO/System.out(10642): Log(jsch,1): Authentications that can continue: publickey,keyboard-interactive,password 
10-26 18:18:24.108: INFO/System.out(10642): Log(jsch,1): Next authentication method: publickey 
10-26 18:18:24.108: INFO/System.out(10642): Log(jsch,1): Authentications that can continue: password 
10-26 18:18:24.118: INFO/System.out(10642): Log(jsch,1): Next authentication method: password 
10-26 18:18:24.128: INFO/System.out(10642): Log(jsch,1): Disconnecting from 192.168.88.1 port 22 
10-26 18:18:24.138: WARN/System.err(10642): com.jcraft.jsch.JSchException: Auth fail 

No hay una gran cantidad de información de registro de jsch para ayudarme a descubrir qué ocurre.

Creo que estoy usando el código bastante estándar para esto:



static { 
     Security.addProvider(new org.spongycastle.jce.provider.BouncyCastleProvider()); 
    } 

En OnCreate estoy quitando el proveedor original BouncyCastle



     Security.removeProvider("BC"); 

Luego añadir la identidad justo antes de intentar conectar



     jsch.addIdentity(key_filename); 

    Properties sshProp = new Properties(); 
    sshProp.put("StrictHostKeyChecking", "no"); 
    session.setConfig(sshProp); 
    session.connect(); 

¿Alguien ha hecho esto con éxito? ¿Estoy olvidando algo?

punto Editar la información adicional:

Como dije en el comentario que ahora estoy sospechando que la clave no está aún siendo juzgado cuando cambio la clave y la prueba de la versión Debian-sshd OpenSSH_5.3p1 3ubuntu7


debug2: mac_setup: found hmac-md5 
debug1: kex: client->server aes128-ctr hmac-md5 none 
debug2: mac_setup: found hmac-md5 
debug1: kex: server->client aes128-ctr hmac-md5 none 
debug2: dh_gen_key: priv key bits set: 122/256 
debug2: bits set: 519/1024 
debug1: expecting SSH2_MSG_KEXDH_INIT 
debug2: bits set: 537/1024 
debug2: kex_derive_keys 
debug2: set_newkeys: mode 1 
debug1: SSH2_MSG_NEWKEYS sent 
debug1: expecting SSH2_MSG_NEWKEYS 
debug2: monitor_read: 5 used once, disabling now 
debug2: set_newkeys: mode 0 
debug1: SSH2_MSG_NEWKEYS received 
debug1: KEX done 
debug1: userauth-request for user root service ssh-connection method none 
debug1: attempt 0 failures 0 
debug2: parse_server_config: config reprocess config len 638 
debug2: input_userauth_request: setting up authctxt for root 
debug2: input_userauth_request: try method none 
debug2: monitor_read: 7 used once, disabling now 
debug1: PAM: initializing for "root" 
debug1: PAM: setting PAM_RHOST to "nexus" 
debug1: PAM: setting PAM_TTY to "ssh" 
debug2: monitor_read: 50 used once, disabling now 
debug2: monitor_read: 3 used once, disabling now 
Failed none for root from 192.168.88.31 port 37807 ssh2 
debug1: userauth-request for user root service ssh-connection method password 
debug1: attempt 1 failures 0 
debug2: input_userauth_request: try method password 
debug1: PAM: password authentication failed for root: Authentication failure 
Failed password for root from 192.168.88.31 port 37807 ssh2 
Received disconnect from 192.168.88.31: 3: com.jcraft.jsch.JSchException: Auth fail 
debug1: do_cleanup 
debug1: do_cleanup 
debug1: PAM: cleanup 

puedo ver ningún intento de utilizar la llave, mientras que desde un PC



debug1: userauth-request for user root service ssh-connection method publickey 
debug1: attempt 1 failures 0 
debug2: input_userauth_request: try method publickey 
debug1: test whether pkalg/pkblob are acceptable 
debug1: Checking blacklist file /usr/share/ssh/blacklist.RSA-2048 
debug1: Checking blacklist file /etc/ssh/blacklist.RSA-2048 
debug1: temporarily_use_uid: 0/0 (e=0/0) 
debug1: trying public key file /root/.ssh/authorized_keys 
debug1: restore_uid: 0/0 
debug1: temporarily_use_uid: 0/0 (e=0/0) 
debug1: trying public key file /root/.ssh/authorized_keys2 
debug1: fd 4 clearing O_NONBLOCK 
debug1: matching key found: file /root/.ssh/authorized_keys2, line 2 

puedo ver el método de llave utilizada. Debajo está el código que estoy usando para probar, no es lindo, sino funcional. Sé que es horrible, pero la contraseña contiene el nombre del archivo y la ruta de la clave que se utilizará cuando AuthType == AUTHENTICATION_METHOD_KEY



public static String testSSHCommand (String username, String password, String hostname, int port, String command, int authtype) throws Exception {  

    JSch jsch = new JSch(); 

    JSch.setLogger(new Logger() { 
      public boolean isEnabled(int i) { 
       return true; 
      } 

      public void log(int i, String s) { 
       System.out.println("Log(jsch," + i + "): " + s); 
      } 
    }); 


    if (authtype != AUTHENTICATION_METHOD_PASSWORD) { 
     Log.v("AUTHMETHOD","authmethod was "+authtype+" with key filename of "+password); 
     jsch.addIdentity(password); 
    } 

    Session session = jsch.getSession(username, hostname, 22); 

    if (authtype != AUTHENTICATION_METHOD_KEY) { 
     session.setPassword(password); 
    } 


    Properties prop = new Properties(); 
    prop.put("StrictHostKeyChecking", "no"); 
    session.setConfig(prop); 

    session.connect(); 

    if (session.isConnected()) { 
     ChannelExec channelssh = (ChannelExec)   
     session.openChannel("exec");  
     ByteArrayOutputStream os = new ByteArrayOutputStream(); 
     channelssh.setOutputStream(os); 
     channelssh.setCommand(command); 
     channelssh.connect();   
     channelssh.disconnect(); 

     return os.toString(); 
    } else { 
     return ""; 
    } 
} 
+0

Sospecho que está utilizando una clave pública incorrecta. ¿El inicio de sesión con los mismos archivos de clave (público + privado) funciona desde un programa PC Java normal? –

+0

No hago desarrollo de Java basado en PC, sin embargo, las claves están bien. Puedo usarlas en mi PC para enviarlas a una caja de servidor para probarlas. De hecho, empiezo a sospechar que las llaves ni siquiera están siendo probadas.(ver edición) – Fuzzy

+0

Al comparar esto con una PC Java normal, ayudaría a aislar el problema, es decir, si está relacionado con su proveedor de cifrado o con su propio código. –

Respuesta

1

He probado su método de envolviéndolo en un class with main method, y con esto, funciona de manera normal Java 6 JRE (sin BouncyCastle), con JSch-0.1.45 (una versión modificada con más salida de registro) y "OpenSSH_5.8p1 Debian-1ubuntu3" sshd.

He añadido un session.disconnect() y algunos duerme en el código, sin embargo.

No tengo Android aquí para ver si esto podría hacer alguna diferencia.

Aquí está mi salida local:

authmethod was 2 with key filename of /home/paulo/.ssh/id_rsa 
Log(jsch,1): Connecting to localhost port 22 
Log(jsch,1): Connection established 
Log(jsch,1): Remote version string: SSH-2.0-OpenSSH_5.8p1 Debian-1ubuntu3 
Log(jsch,1): Local version string: SSH-2.0-JSCH-0.1.45 
Log(jsch,1): CheckCiphers: aes256-ctr,aes192-ctr,aes128-ctr,aes256-cbc,aes192-cbc,aes128-cbc,3des-ctr,arcfour,arcfour128,arcfour256 
Log(jsch,1): aes256-ctr is not available. 
Log(jsch,1): aes192-ctr is not available. 
Log(jsch,1): aes256-cbc is not available. 
Log(jsch,1): aes192-cbc is not available. 
Log(jsch,1): arcfour256 is not available. 
Log(jsch,1): CheckKexes: diffie-hellman-group14-sha1 
Log(jsch,1): diffie-hellman-group14-sha1 is not available. 
Log(jsch,1): SSH_MSG_KEXINIT sent 
Log(jsch,1): SSH_MSG_KEXINIT received 
Log(jsch,1): kex: server->client aes128-ctr hmac-md5 none 
Log(jsch,1): kex: client->server aes128-ctr hmac-md5 none 
Log(jsch,1): SSH_MSG_KEXDH_INIT sent 
Log(jsch,1): expecting SSH_MSG_KEXDH_REPLY 
Log(jsch,1): ssh_rsa_verify: signature true 
Log(jsch,2): Permanently added 'localhost' (RSA) to the list of known hosts. 
Log(jsch,1): SSH_MSG_NEWKEYS sent 
Log(jsch,1): SSH_MSG_NEWKEYS received 
Log(jsch,1): SSH_MSG_SERVICE_REQUEST sent 
Log(jsch,1): SSH_MSG_SERVICE_ACCEPT received 
Log(jsch,1): Authentications that can continue: publickey,keyboard-interactive,password 
Log(jsch,1): Next authentication method: publickey 
Log(jsch,1): Authentication succeeded (publickey). 
Log(jsch,0): packet received, type: 91 
Log(jsch,1): SSH_MSG_CHANNEL_OPEN_CONFIRMATION received, channel: 0 
Log(jsch,0): packet received, type: 94 
Log(jsch,1): SSH_MSG_CHANNEL_DATA received, channel: 0, len: 13 
Log(jsch,0): packet received, type: 96 
Log(jsch,1): SSH_MSG_CHANNEL_EOF received, channel: 0 
Log(jsch,0): packet received, type: 98 
Log(jsch,1): SSH_MSG_CHANNEL_REQUEST received, channel: 0, type: [[email protected], want reply: false 
Log(jsch,0): packet received, type: 97 
Log(jsch,1): SSH_MSG_CHANNEL_CLOSE received, channel: 0 
Log(jsch,1): Disconnecting from localhost port 22 
Log(jsch,1): Caught an exception, leaving main loop due to Socket closed 
Output: »Hallo, Welt! 
« 

(Me llama el programa con argumentos paulo -key /home/paulo/.ssh/id_rsa localhost 22 hello, por lo que ejecuta el programa Hola Mundo defecto en el equipo de destino, y en alemán, porque esta es mi configuración regional definida.)

+0

Entonces, ¿estamos diciendo que jsch no funciona con las teclas en Android? – Fuzzy

+0

Estoy diciendo que no sé el motivo. Sin embargo, podrías probar mi programa de prueba con tu llave en tu computadora para comparar. (Y tal vez pruebe la versión más de depuración de salida de JSch en el repositorio de GitHub vinculado, para ver si obtiene más información.) –

+0

Hoy estoy siendo extremadamente tenue, no puedo encontrar su jar actualizado del enlace que dio ¿Podrías proporcionar el enlace directo? – Fuzzy

Cuestiones relacionadas