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

时间:2019-02-02 13:45:38

标签: java android sockets rsa

目前,我正在做一个学校项目。该项目的目标是从服务器接收数据并将数据写入服务器。为此,我使用了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();
    }
}

将对象强制转换为公钥时发生错误(第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 Server上却安装了Java 11。我降级了Java并再次对其进行了测试。什么都没改变。

我的问题

Android中是否有错误? 我必须将Java升级到11吗? 有什么问题吗?

感谢您的帮助。 RT

1 个答案:

答案 0 :(得分:0)

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

但是,当您从移动设备进行连接时,将使用Android Java版本,并且该版本显然包含类if let view = self.view as! SKView? { if let scene = GameScene(fileNamed: "GameScene") { view.presentScene(scene) } } 的Android特定对象。服务器在库中的任何地方都没有这些类定义,因此无法对它们进行反序列化。

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