java - connect() 上的 Android SSH 异常 - "KeyFactory ECDSA implementation not found"

标签 java android ssh raspberry-pi sshj

我正在尝试从我的 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/

相关文章:

java - Android框架中javadoc中的@remove是什么意思

java - 如何在 Android 应用程序中显示不支持(格式)的图像?

android - 检查 Bluetooth Low Energy Beacons 是否在 Android 附近

linux - Azure Linux VM 上的 OpenSSH SSH-2 私钥(旧 PEM 格式)

java - C和Java中的字符

java - Spring-data-neo4j 没有索引实体 id

perl - 打开最新的日志文件并打印晚于特定时间戳的行

ssh - screen "Must be connected to a Terminal."

java - JAX-RS 2.1 参数类型 Object.class

java - OnClickListener onClick=true 和选择器