我正在尝试从我的 Android 应用程序打开一个 SSH 客户端会话。尝试连接到本地网络上的设备(Raspberry Pi)。我正在使用SSHJ库版本 0.10.0。它在ssh.connect()
通话中失败,TransportException
最终由 a 引起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 之外,它还引入了以下三个库...
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,并使用用户名和密码进行身份验证。这工作正常,所以它似乎不是网络问题。