当前位置: 首页 > 知识库问答 >
问题:

如何在Android Pie上运行Apache-Mina SSHD服务器(2.2.0)?

费和惬
2023-03-14

我试图在Android Pie(API 28.0)设备上运行ApacheMina SSHD服务器(2.2.0版)。我在Android4设备上找到了各种关于它的帖子,但似乎没有一个能在我的Android9设备上运行。所以我尝试自己实现它,但在服务器初始化时遇到了ReflectionException/NoClassDefFoundError。

当我尝试用SshServer.setUpDefaultServer()设置服务器时,我会得到这个异常:

java.lang.NoClassDefFoundError: Failed resolution of: Ljavax/management/ReflectionException;
        at org.apache.sshd.common.util.GenericUtils.peelException(GenericUtils.java:730)
        at org.apache.sshd.common.util.GenericUtils.peelException(GenericUtils.java:728)
        at org.apache.sshd.common.util.security.SecurityEntityFactory$2.getInstance(SecurityEntityFactory.java:134)
        at org.apache.sshd.common.util.security.SecurityUtils.getMessageDigest(SecurityUtils.java:726)
        at org.apache.sshd.common.digest.DigestUtils.checkSupported(DigestUtils.java:53)
        at org.apache.sshd.common.digest.BuiltinDigests.<init>(BuiltinDigests.java:61)
        at org.apache.sshd.common.digest.BuiltinDigests.<clinit>(BuiltinDigests.java:36)
        at org.apache.sshd.common.cipher.ECCurves.<clinit>(ECCurves.java:61)
        at org.apache.sshd.common.keyprovider.KeyPairProvider.<clinit>(KeyPairProvider.java:63)
        at org.apache.sshd.common.signature.BuiltinSignatures.<clinit>(BuiltinSignatures.java:62)
        at org.apache.sshd.common.BaseBuilder.<clinit>(BaseBuilder.java:133)
        at org.apache.sshd.server.ServerBuilder.builder(ServerBuilder.java:165)
        at org.apache.sshd.server.SshServer.setUpDefaultServer(SshServer.java:429)
        at ch.zhaw.init.sshshell.SshShellService.<init>(SshShellService.java:20)

从Android4的一些老帖子来看,这似乎是一个已知的问题,解决方案是添加$useLibrary'org。阿帕奇。http。将“遗产”添加到gradle并添加到清单中。xml。我这么做了,但例外情况仍然存在。

建筑gradle文件:

android {
    compileSdkVersion 28
    useLibrary 'org.apache.http.legacy'
    ...
}
dependencies {
    ...
    implementation 'org.apache.sshd:sshd-core:2.2.0'
    implementation 'org.slf4j:slf4j-simple:1.6.2'
    implementation 'org.apache.mina:mina-core:2.1.2'
    implementation "org.bouncycastle:bcprov-jdk16:1.46"
}

manifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="ch.zhaw.init.sshshell">
    <application
            android:networkSecurityConfig="@xml/network_security_config">
        <uses-library android:name="org.apache.http.legacy"
                      android:required="false" />
        <service android:name=".SshShellService">
            <intent-filter>
                <action android:name="StartSshServer"/>
            </intent-filter>
        </service>
    </application>
</manifest>

我的Java代码:

import org.apache.sshd.server.SshServer;
import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider;


private static final int PORT = 8022;
private final SshServer sshd = SshServer.setUpDefaultServer(); // Here I get the error
private final SimplePasswordAuthenticator passwordAuth = new SimplePasswordAuthenticator();
private final SimplePublicKeyAuthenticator publicKeyAuth = new SimplePublicKeyAuthenticator();
private final SimpleForwardingFilter forwardingFilter = new SimpleForwardingFilter();

旧版本似乎有效,但我搜索了几天,没有找到最新版本的任何有效示例。有没有人有一个在Android9上运行最新版本Apache Mina SSHD(2.2.0)的工作示例(不支持设备)?

或者,如果没有,Android Pie是否有替代的SSH服务器(不是客户端——有很多)?

谢谢你的帮助。

共有2个答案

施刚毅
2023-03-14

由于BouncyCastle库导致的错误已被弃用为android9(api级别28)。

您可以从aosp获得详细提示:http://androidxref.com/9.0.0_r3/xref/libcore/ojluni/src/main/java/sun/security/jca/Providers.java#548

https://android-developers.googleblog.com/2018/03/cryptography-changes-in-android-p.html

要解决此问题,您可以按照以下步骤:

  1. 系统默认值卸载BouncyCastleProvider
Security.removeProvider("BC");
Security.addProvider(new BouncyCastleProvider());
 SshServer sshd = SshServer.setUpDefaultServer();
 sshd.setPort(ssdServerPort);
 ....

aosp只需比较对象即可确定bc provider对象是否为系统默认提供程序,因此只需替换为新的bc provider对象即可:http://androidxref.com/9.0.0_r3/xref/libcore/ojluni/src/main/java/sun/security/jca/Providers.java#341

注意:必须使用:安全性卸载提供程序。在安装提供程序之前,请移除提供程序(“BC”)

云承天
2023-03-14

对于这个特定的失败,创建一个伪ReflectionException类就足够了(示例)。考虑到这个类甚至不存在,除了您自己的代码之外,没有任何东西会实例化它,因此SSHD的instanceof ReflectionException检查将永远不会匹配,并且您不需要编程它的任何成员。

您还需要创建一个伪MBeanException(示例)。

 类似资料:
  • 我有一个运行Ubuntu 14.04的DigitalOcean服务器。我将它用作我的web开发项目的主机。现在我想开始在我的一个项目中使用Laravel,但我有一个问题。 在Ubuntu的/var/www/html文件夹中,我创建了一个文件夹,比如说,“project”。在这个文件夹中,我使用本教程安装了Laravel。现在一切都设置好了,我想运行Laravel,这样我就可以测试它并开始开发它。当

  • 问题内容: 我需要将Silverlight 2.0应用程序部署到Apache服务器,但是它在Linux下。 这可能吗?我的意思是,我是否需要在服务器中安装.Net 3.5和可以执行Asp.Net的网站? 谢谢您的帮助… 问题答案: 如果apache服务器只是在没有任何ASPX页面的情况下提供Silverlight应用程序,那么您应该没问题。Silverlight是一种客户端技术,因此它在服务器上不

  • 问题内容: 我目前可以在我的Apache服务器上通过mod_wsgi或PHP运行Django。 我的Django项目在以下位置运行:http:// localhost,源代码在C:/ django_proj 我的PHP项目在以下位置运行:http://php.localhost,源代码在C:/ web 如果同时打开,则php.localhost和localhost转到Django项目。我已经通过A

  • 问题内容: 我刚刚开始学习Python,现在我很迷路。我想在通过hosting24.com托管的服务器上运行脚本。他们的常见问题解答说他们支持Python,但是我不知道将脚本放在哪里运行。 我的根目录中有一个名为cgi-bin的文件夹,我猜这是我放置脚本的位置吗?有人可以向我解释这是如何工作的吗? 问题答案: 很简单,您可以将Python脚本重命名为“ pythonscript.cgi”。将其发布

  • 但我总是遇到selenium服务器死掉的问题。谁能告诉我怎样才能最好地保持硒呢?对于维护selenium服务器,我应该知道哪些最佳实践? 在运行selenium测试时,我有时会遇到以下错误

  • 问题内容: 我在CI和CD上创建了Jenkinsfile,Dockerfile,Dockerfile.test到CI和CD,在GitHub上构建了我的服务器API,我在Jenkins上构建了该构建,并且构建成功,并且我的docker在Jenkinsfile阶段也在容器上运行,我创建了用于测试和部署在服务器API上,并使用docker作为容器 我也使用docker-compose在docker上运行