Fuz*_*zzy 6 ssh android bouncycastle jsch spongycastle
我目前有一个Android应用程序通过ssh使用密码连接到我的路由器.我正在寻求改进这个,所以我可以使用键,但我有真正的问题.根据我的理解,android附带的bouncycastle版本是一个残缺的版本,因为这个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
Run Code Online (Sandbox Code Playgroud)
jsch没有大量的日志记录信息来帮助我弄清楚什么是错的.
我想我正在使用非常标准的代码:
static {
Security.addProvider(new org.spongycastle.jce.provider.BouncyCastleProvider());
}
Run Code Online (Sandbox Code Playgroud)
在OnCreate中,我正在移除原始的bouncycastle提供商
Security.removeProvider("BC");
Run Code Online (Sandbox Code Playgroud)
然后我在尝试连接之前添加身份
jsch.addIdentity(key_filename);
Properties sshProp = new Properties();
sshProp.put("StrictHostKeyChecking", "no");
session.setConfig(sshProp);
session.connect();
Run Code Online (Sandbox Code Playgroud)
有人做过这个吗?我忘记了什么吗?
编辑点附加信息:
正如我在评论中所说,我现在怀疑当我切换密钥并在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
Run Code Online (Sandbox Code Playgroud)
我可以看到没有尝试使用密钥,而从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
Run Code Online (Sandbox Code Playgroud)
我可以看到正在使用的关键方法.下面是我用于测试的代码,不是很漂亮但功能齐全.我知道它很可怕但是密码确实包含了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 "";
}
}
Run Code Online (Sandbox Code Playgroud)
我通过将你的方法包装到一个带有 main 方法的类中来测试你的方法,这样,它就可以在普通的 Java 6 JRE(无 BouncyCastle)中工作,并带有 JSch-0.1.45(具有更多日志输出的修改版本)和“OpenSSH_5.4”。 8p1 Debian-1ubuntu3" sshd。
\n\n不过,我session.disconnect()在代码中添加了一些睡眠。
我这里没有 Android 设备,想看看这是否会产生任何影响。
\n\n这是我的本地输出:
\n\nauthmethod was 2 with key filename of /home/paulo/.ssh/id_rsa\nLog(jsch,1): Connecting to localhost port 22\nLog(jsch,1): Connection established\nLog(jsch,1): Remote version string: SSH-2.0-OpenSSH_5.8p1 Debian-1ubuntu3\nLog(jsch,1): Local version string: SSH-2.0-JSCH-0.1.45\nLog(jsch,1): CheckCiphers: aes256-ctr,aes192-ctr,aes128-ctr,aes256-cbc,aes192-cbc,aes128-cbc,3des-ctr,arcfour,arcfour128,arcfour256\nLog(jsch,1): aes256-ctr is not available.\nLog(jsch,1): aes192-ctr is not available.\nLog(jsch,1): aes256-cbc is not available.\nLog(jsch,1): aes192-cbc is not available.\nLog(jsch,1): arcfour256 is not available.\nLog(jsch,1): CheckKexes: diffie-hellman-group14-sha1\nLog(jsch,1): diffie-hellman-group14-sha1 is not available.\nLog(jsch,1): SSH_MSG_KEXINIT sent\nLog(jsch,1): SSH_MSG_KEXINIT received\nLog(jsch,1): kex: server->client aes128-ctr hmac-md5 none\nLog(jsch,1): kex: client->server aes128-ctr hmac-md5 none\nLog(jsch,1): SSH_MSG_KEXDH_INIT sent\nLog(jsch,1): expecting SSH_MSG_KEXDH_REPLY\nLog(jsch,1): ssh_rsa_verify: signature true\nLog(jsch,2): Permanently added \'localhost\' (RSA) to the list of known hosts.\nLog(jsch,1): SSH_MSG_NEWKEYS sent\nLog(jsch,1): SSH_MSG_NEWKEYS received\nLog(jsch,1): SSH_MSG_SERVICE_REQUEST sent\nLog(jsch,1): SSH_MSG_SERVICE_ACCEPT received\nLog(jsch,1): Authentications that can continue: publickey,keyboard-interactive,password\nLog(jsch,1): Next authentication method: publickey\nLog(jsch,1): Authentication succeeded (publickey).\nLog(jsch,0): packet received, type: 91\nLog(jsch,1): SSH_MSG_CHANNEL_OPEN_CONFIRMATION received, channel: 0\nLog(jsch,0): packet received, type: 94\nLog(jsch,1): SSH_MSG_CHANNEL_DATA received, channel: 0, len: 13\nLog(jsch,0): packet received, type: 96\nLog(jsch,1): SSH_MSG_CHANNEL_EOF received, channel: 0\nLog(jsch,0): packet received, type: 98\nLog(jsch,1): SSH_MSG_CHANNEL_REQUEST received, channel: 0, type: [B@1ad086a, want reply: false\nLog(jsch,0): packet received, type: 97\nLog(jsch,1): SSH_MSG_CHANNEL_CLOSE received, channel: 0\nLog(jsch,1): Disconnecting from localhost port 22\nLog(jsch,1): Caught an exception, leaving main loop due to Socket closed\nOutput: \xc2\xbbHallo, Welt!\n\xc2\xab\nRun Code Online (Sandbox Code Playgroud)\n\n(我使用参数调用该程序paulo -key /home/paulo/.ssh/id_rsa localhost 22 hello,因此它在目标计算机上执行默认的 Hello World 程序,并且是德语,因为这是我配置的区域设置。)
| 归档时间: |
|
| 查看次数: |
1714 次 |
| 最近记录: |