Почему Java не может загрузить этот класс: com.android.org.conscrypt.OpenSSLRSAPublicKey - PullRequest
0 голосов
/ 02 февраля 2019

В настоящее время я работаю над школьным проектом.Целью этого проекта является получение данных с Сервера и запись данных на Сервер.Для этого я использую Sockets и ServerSockets.Для шифрования сообщений я использую кодек Apache Commons 1.9.

(Сервер - это файл Java .jar, выполняемый на сервере Ubuntu, а клиент - приложение для 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).

Клиент выполняет ту же функцию, но получает и отправляет объект.

Ошибка

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)

Существует еще

Теперь странная часть: все работает, если я использую клиент, работающий на ПК.Поэтому я понял, что мой сервер был написан на Java 10, но на моем Ubuntu Server была установлена ​​Java 11.Я понизил Java и протестировал его снова.Ничего не изменилось.

Мои вопросы

Есть ли ошибка в Android?Нужно ли обновлять Java до 11?В чем проблема?

Спасибо за помощь.RT

1 Ответ

0 голосов
/ 02 февраля 2019

Вы отправляете не ключ (некоторое строковое или числовое значение), а весь Java-объект туда и обратно через Object*Stream s.Когда вы используете ПК, вы в основном используете ту же реализацию Java, что и сервер, поэтому сервер может десериализовать этот объект Java.Если вы System.out.println .getClass() получили объект на сервере, вы обнаружите, что он не говорит о com.android.....

Тем не менее, когда вы подключаетесь со своего мобильного устройства, используется версия Java для Android, и она, очевидно, содержит специфичные для Android объекты класса com.android.org.conscrypt.OpenSSLRSAPublicKey.Сервер не имеет этих определений классов нигде в своей библиотеке, поэтому он не может десериализовать их.

Вместо того, чтобы де-сериализовать объекты ключей Java, вы должны отправить простые ключи.

...