Jsch с spongycastle, а не bouncycastle на Android

В настоящее время у меня есть приложение для Android, которое подключается к моему маршрутизатору через ssh с использованием пароля. Я хочу улучшить это, чтобы использовать ключи, но у меня серьезные проблемы. Насколько я понимаю, версия bouncycastle, включенная в Android, является урезанной версией, и из-за этого ключи ssh не работают с jsch. Я посмотрел на spongycastle, который претендует на более полную реализацию. Ниже приведен результат, который в основном такой же, как при использовании 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

В jsch не так много информации журнала, которая могла бы помочь мне разобраться в том, что не так.

Мне кажется, я использую для этого довольно стандартный код:



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

В OnCreate я удаляю исходный провайдер bouncycastle



        Security.removeProvider("BC");

Затем я добавляю идентификатор непосредственно перед попыткой подключения



        jsch.addIdentity(key_filename);

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

Кто-нибудь сделал это успешно? Я что-то забыл?

Дополнительная информация о точке редактирования:

Как я сказал в комментарии, теперь я подозреваю, что ключ даже не проверяется, когда я переключаю ключ и тестирую на версии 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

Я не вижу попытки использовать ключ, тогда как с компьютера



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

я вижу используемый метод ключа. Ниже приведен код, который я использую для тестирования, не красивый, но функциональный. Я знаю, что это ужасно, но пароль действительно содержит имя файла и путь к ключу, который будет использоваться, когда 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 "";
    }
}
6
задан Roberto Tyley 9 April 2013 в 23:06
поделиться