为什么Java无法加载这个类:com.android.org.conscrypt.OpenSSLRSAPublicKey

3
最初的回答:目前我正在进行一项学校项目。该项目的目标是从服务器接收数据并将数据写入服务器。为此,我使用套接字和服务器套接字。为了加密消息,我使用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行)时,会出现错误。

客户端具有相同的功能,但他接收并发送一个对象。

错误信息

最初的回答

:此错误发生在将对象强制转换为公钥(第108行)时。客户端具有相同的功能,但它接收并发送一个对象。请检查代码以解决此问题。
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吗? 问题出在哪里?

感谢您的帮助。 RT

1个回答

0

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

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

与其对Java密钥对象进行序列化/反序列化,您应该发送纯密钥。


你可以创建一个通用的jar库,其中包含自定义数据类,这两个项目都将其作为依赖项 - 如果你想序列化/反序列化对象类型。 - Mark
非常感谢。那完全有道理。 - RedTek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接