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