Jsch con spongycastle en lugar de bouncycastle en Android

Actualmente tengo una aplicación de Android conectada a mi enrutador a través de ssh usando una contraseña. Estoy buscando mejorar esto para que pueda usar claves pero estoy teniendo problemas reales. Por lo que entiendo la versión de bouncycastle incluido con android es una versión lisiada y debido a que las claves ssh no funcionan con jsch. He mirado en spongycastle que demanda ser una puesta en práctica más completa. A continuación se muestra el resultado que es básicamente el mismo que usar bouncycastle, Auth Fail.

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 resolver lo que está mal.

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

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

En OnCreate estoy eliminando el proveedor original de bouncycastle

 Security.removeProvider("BC"); 

A continuación, agregar 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 exitosamente? ¿Me estoy olvidando de algo?

Editar información adicional punto:

Como dije en el comentario ahora estoy sospechando que la clave ni siquiera se está intentando cuando cambio la clave y la prueba en la versión sshd OpenSSH_5.3p1 Debian-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 

No puedo ver ningún intento de utilizar la clave, 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 clave que se está utilizando. Debajo está el código que estoy usando para la prueba, no bastante pero funcional. Sé que es horrible, pero la contraseña contiene el nombre de archivo y la ruta de acceso 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 ""; } } 

He probado su método por envolverlo en una clase con el método principal , y con esto, funciona en un Java JRE normal (no 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 haría alguna diferencia.

Aquí está mi producción 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: [B@1ad086a, 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! « 

(He llamado al programa con argumentos paulo -key /home/paulo/.ssh/id_rsa localhost 22 hello , por lo que ejecuta el programa de Hello World por defecto en la máquina de destino, y en alemán, porque esta es mi configuración regional.)

  • Uso de ConnectBot con intentos
  • Múltiples comandos a través de Jsch Shell
  • Cómo iniciar connectbot de mi propia actividad a través de la intención
  • Código de ejemplo de Android SSH
  • SSH simple conecta con JSch
  • SSH Java-biblioteca para Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.