【问题标题】:Why cant Java load this class: com.android.org.conscrypt.OpenSSLRSAPublicKey为什么Java不能加载这个类:com.android.org.conscrypt.OpenSSLRSAPublicKey
【发布时间】:2019-02-02 13:45:37
【问题描述】:

目前我正在做一个学校项目。该项目的目标是从服务器接收数据并将数据写入服务器。为此,我使用了 Sockets 和 ServerSockets。为了加密消息,我使用 Apache Commons Codec 1.9。

(服务器是在 Ubuntu 服务器上执行的 java .jar 文件,客户端是 android 应用)

服务器/客户端

为了加密我正在交换公钥的消息。

private void Schluesselaustausch() {
    try {

        GenerateKeys gk = new GenerateKeys(4069);
        gk.createKeys();
        ServerPrivateKey = gk.getPrivateKey();

        ObjectOutputStream oos = new ObjectOutputStream(clientSocket.getOutputStream());
        oos.writeObject(gk.getPublicKey());
        oos.flush();
        ObjectInputStream ois = new ObjectInputStream(clientSocket.getInputStream());
        Object obj = ois.readObject();
        ClientPublicKey = (PublicKey) obj; //Line 108

    } catch (Exception e) {
        e.printStackTrace();
    }
}

将对象强制转换为 PublicKey(第 108 行)时会发生错误。

Client也有同样的功能,只不过是接收然后发送一个对象。

错误

java.lang.ClassNotFoundException: com.android.org.conscrypt.OpenSSLRSAPublicKey
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:190)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:499)
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:374)
    at java.base/java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:685)
    at java.base/java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1879)
    at java.base/java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1765)
    at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2053)
    at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1587)
    at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:422)
    at Engine.ClientVerbindung.Schluesselaustausch(ClientVerbindung.java:108)
    at Engine.ClientVerbindung.run(ClientVerbindung.java:49)

还有更多

现在到奇怪的部分:如果我使用在 PC 上运行的客户端,一切正常。所以我发现我的服务器是用 Java 10 编码的,但在我的 Ubuntu 服务器上安装了 Java 11。我降级了Java并再次对其进行了测试。没有任何改变。

我的问题

Android 有错误吗? 我必须将java升级到11吗? 有什么问题?

感谢您的帮助。 反转录

【问题讨论】:

    标签: java android sockets rsa


    【解决方案1】:

    您不是通过Object*Streams 来回发送键(某个字符串或数值)而是整个Java 对象。当您使用 PC 时,您基本上使用与服务器相同的 Java 实现,因此服务器可以反序列化这个 Java 对象。如果你System.out.println服务器上接收到的对象的.getClass(),你会发现它并没有谈论com.android....

    然而,当您从移动设备连接时,使用的是 Android Java 版本,它显然包含类 com.android.org.conscrypt.OpenSSLRSAPublicKey 的 Android 特定对象。服务器在其库中的任何地方都没有这些类定义,因此无法反序列化它们。

    而不是反序列化/序列化 Java 密钥对象,您应该发送普通密钥。

    【讨论】:

    • 如果你想序列化/反序列化一个对象类型,你可以创建一个自定义数据类的通用 jar 库,这两个项目都包含在依赖项中。
    • 非常感谢。这完全有道理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 2010-10-25
    相关资源
    最近更新 更多