7

Android アプリから SSH クライアント セッションを開こうとしています。ローカル ネットワーク上のデバイス (Raspberry Pi) に接続しようとしています。SSHJライブラリ バージョン 0.10.0を使用しています。ssh.connect()呼び出しに失敗し、TransportException最終的には が原因NoSuchAlgorithmExceptionです。以下の例外ツリーを参照してください。

SSHClient ssh = new SSHClient(new AndroidConfig());
Session session = null;

try {    
    //ssh.loadKnownHosts();

    // Exception thrown on this line
    ssh.connect("192.168.1.109", 22);

    // Doesn't reach below
    ssh.authPassword("user", "password");
    session = ssh.startSession();
}
catch (net.schmizz.sshj.transport.TransportException ex) {
    ;
}

例外ツリー:

net.schmizz.sshj.transport.TransportException
 net.schmizz.sshj.common.SSHException
  net.schmizz.sshj.common.SSHRuntimeException
   java.security.GeneralSecurityException: java.security.NoSuchAlgorithmException: KeyFactory ECDSA implementation not found
    java.security.NoSuchAlgorithmException: KeyFactory ECDSA implementation not found

その他のシステム情報:

SSHJ library   : v0.10.0
Android device : Galaxy Note 3 running Android 4.4.2

Android Studio の maven 依存関係サポートを使用して SSHJ JAR を取り込み、SSHJ v0.10.0 jar に加えて次の 3 つのライブラリを取り込みました...

bouncy castle...
  bcpkix-jdk15on-1.50.jar
  bcprov-jdk15on-1.50.jar
logging....
  slf4j-api-1.7.7.jar

この例外をどこから始めればよいかわかりません...どんな提案でも大歓迎です! ありがとう。

更新: 2014 年 10 月 31 日

LeeDavidPainterの提案に従って、SpongyCastle 1.51.0 JAR をインクルードし、上部に次の行を追加しました。

Security.insertProviderAt(new org.spongycastle.jce.provider.BouncyCastleProvider(), 1);

同じ行で別の例外が発生しています。

net.schmizz.sshj.transport.TransportException
 net.schmizz.sshj.common.SSHException
  net.schmizz.sshj.common.SSHRuntimeException
   java.security.GeneralSecurityException: java.security.spec.InvalidKeySpecException: key spec not recognised
    java.security.spec.InvalidKeySpecException: key spec not recognised

また、同じ結果で次の行も試したことに注意してください。

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

私の携帯電話には、基本的に私が達成したいことを正確に実行する別のアプリがあります-RaspberryPiControllerと呼ばます-ユーザー名とパスワード認証を使用してSSH経由でRPiに接続します。これは正常に機能するため、ネットワークの問題ではないようです。

4

6 に答える 6

2

ここで sshj 0.9.0 にダウングレードします: http://mvnrepository.com/artifact/net.schmizz/sshj/0.9.0

この問題は 0.10.x で導入されたようです。また、他の JCE プロバイダーも試しましたが、同じ問題が発生しました。

于 2015-02-03T02:50:56.377 に答える
0

SSHJ でこの問題を解決できなかったので、同じ機能を提供するJSchを試してみることにしました。Maven リポジトリとしても利用できます - 私はjsch バージョン 0.1.51 ('com.jcraft:jsch:0.1.51') を使用しました。

このコードフラグメントで初めて機能しました。

import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;

import java.io.ByteArrayOutputStream;
import java.util.Properties;

JSch jsch = new JSch();
com.jcraft.jsch.Session session = null;
String result = "";

try {    
  session = jsch.getSession("user", "192.168.1.109", 22);
  session.setPassword("password");

  // Avoid asking for key confirmation
  Properties prop = new Properties();
  prop.put("StrictHostKeyChecking", "no");
  session.setConfig(prop);
  session.connect();

  // SSH Channel
  ChannelExec channel = (ChannelExec)session.openChannel("exec");
  ByteArrayOutputStream stream = new ByteArrayOutputStream();
  channel.setOutputStream(stream);

  // Execute command
  channel.setCommand("ls -ltr");
  channel.connect(1000);
  java.lang.Thread.sleep(500);   // this kludge seemed to be required.
  channel.disconnect();

  result = stream.toString();
}
catch (JSchException ex) {
  String s = ex.toString();
  System.out.println(s);
}
catch (InterruptedException ex) {
  String s = ex.toString();
  System.out.println(s);
}
finally {
  if (session != null)
    session.disconnect();
}

SSHJ と比較して使用すると、より堅牢な実装のように感じます。または、この印象は、かなり保守的なタイムアウトを選択したことが原因である可能性があります。たとえば、ターゲット デバイスの電源がオフになっている場合、session.connect() 呼び出しはデフォルトで 20 秒ほど接続を試行し続けます。

于 2014-10-31T13:39:48.880 に答える
0

Jschは、SSH AFAIKの楕円曲線アルゴリズムをサポートしていないため、おそらく機能しました。楕円曲線アルゴリズムが必要ない場合は、それが答えです。

于 2014-11-01T12:48:14.327 に答える