为什么不能 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 密钥对象,您应该发送普通密钥。
目前我正在做一个学校项目。该项目的目标是从服务器接收数据并将数据写入服务器。为此,我使用套接字和服务器套接字。为了加密消息,我使用 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 密钥对象,您应该发送普通密钥。