为什么不能 Java 加载此 class:com.android.org.conscrypt.OpenSSLRSAPublicKey

Why cant Java load this class: com.android.org.conscrypt.OpenSSLRSAPublicKey

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

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

Server/Client

为了加密消息,我正在交换 public 个密钥。

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 吗? 有什么问题?

感谢您的帮助。 转发

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

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

而不是 de-/serializing Java 密钥对象,您应该发送普通密钥。