我正在尝试从我的 Android 应用打开 SSH 客户端 session 。尝试连接到本地网络上的设备(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 之外,它还引入了以下三个库......
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 - 它使用用户名和密码 auth 通过 SSH 连接到您的 RPi。这工作正常,所以它似乎不是网络问题。
最佳答案
Android 附带了 BouncyCaSTLe 的缩减版本,其中不包含 ECDSA 算法。因此,即使您在类路径中包含完整版本,Android 运行时版本也会被选取并使用。
你可能想看看http://rtyley.github.io/spongycastle/这是为了解决这个问题而创建的,它是 BouncycaSTLe 的重新打包版本,可以作为单独的 JCE 提供程序安装在 Android 中。在您尝试连接 SSHJ(未测试)之前,只需将其安装为默认的 JCE 提供程序。
Security.insertProviderAt(new org.spongycastle.jce.provider.BouncyCastleProvider(), 1);
关于java - connect() 上的 Android SSH 异常 - "KeyFactory ECDSA implementation not found",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26653399/