Java Kryonet RSAPublicKeyImpl не зарегистрирован

Я пытаюсь отправить PublicKey (java.security.PublicKey) с сервера Kryonet клиенту, используя connection.sendTCP(key);. При этом я получаю это исключение:

Exception in thread "pool-1-thread-1" java.lang.IllegalArgumentException: Class is not registered: sun.security.rsa.RSAPublicKeyImpl
Note: To register this class use: kryo.register(sun.security.rsa.RSAPublicKeyImpl.class);
at com.esotericsoftware.kryo.Kryo.getRegistration(Kryo.java:443)
at com.esotericsoftware.kryo.util.DefaultClassResolver.writeClass(DefaultClassResolver.java:73)
at com.esotericsoftware.kryo.Kryo.writeClass(Kryo.java:475)
at com.esotericsoftware.kryo.Kryo.writeClassAndObject(Kryo.java:568)
at com.esotericsoftware.kryonet.KryoSerialization.write(KryoSerialization.java:50)
at com.esotericsoftware.kryonet.TcpConnection.send(TcpConnection.java:192)
at com.esotericsoftware.kryonet.Connection.sendTCP(Connection.java:59)
at darpix.accountManager.AccountManager$1.received(AccountManager.java:93)
at com.esotericsoftware.kryonet.Listener$QueuedListener$3.run(Listener.java:102)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)

Я зарегистрировал эти пять классов:

k.register(AccountRequest.class);
k.register(AccountResponse.class);
k.register(KeyResponse.class);
k.register(PublicKey.class);
k.register(byte[].class);

Я нигде не использовал RSAPublicKeyImpl в своем коде и не могу найти его нигде в библиотеках, которые использую.


person Wesley S    schedule 04.03.2018    source источник
comment
[stackoverflow.com/questions/ 21606428/   -  person Wesley S    schedule 05.03.2018


Ответы (1)


Вероятно, не полный ответ, но слишком много для комментариев.

Java crypto (JCA/JCE) публикует (документирует) серию общих «фасадных» классов, таких как Signature Cipher Key и т. д., но фактические классы реализации для большого разнообразия алгоритмов и вариантов предоставляются переменным набором криптопровайдеров, могут варьироваться в зависимости от криптопровайдеров или версии, и не являются опубликованными или стабильными - за исключением соответствия их родительским классам и интерфейсам, которое требуется правилами OO. Многие, хотя и не все из этих классов реализации, относятся к категории sun.* или com.sun.*.

Обычная сериализация и десериализация Java не предназначена для работы с криптообъектами. Правильный способ передачи или хранения ключа заключается не в использовании объекта ключа, а в использовании кодирования ключа, который представляет собой стандартизированную последовательность байтов, которая определена как стабильная в различных реализациях. и версии.

В отправителе вы можете вызвать Key.getEncoded(), который среди прочих унаследован PublicKey и PrivateKey, хотя они используют разные кодировки (соответственно X.509 и PKCS#8), и отправить полученные байты. В приемнике используйте KeyFactory.getInstance(algorithm[,provider]) для получения фабрики ключей для правильного алгоритма, затем вызовите .generatePublic или .generatePrivate с соответственно X509EncodedKeySpec или PKCS8EncodedKeySpec, содержащим кодировку X.509 или PKCS#8. Обратите внимание, что получатель должен знать алгоритм, который может потребоваться отправить дополнительно; это технически избыточно, потому что идентификатор алгоритма включен в (стандартные) кодировки PKCS # 8 и X.509, но его не так просто извлечь.

Я не знаю, как (и нужно ли) интегрировать это с крио.

Обратите внимание, что экстернализация закрытого ключа в незашифрованном виде поддерживается, но часто небезопасна. Обычно предпочтительнее передавать или хранить пары ключей, содержащие закрытый ключ, в KeyStore, который сериализуется в поток или десериализуется из потока (часто файла) в зашифрованном виде с использованием .store и .load. Хотя открытые ключи не нужно шифровать, часто бывает небезопасно передавать или хранить их без аутентификации, которая обычно выполняется путем помещения их в сертификат, обычно сертификат X.509v3, который кодируется аналогичным образом. как последовательность байтов (которая на самом деле довольно широко реализована).

person dave_thompson_085    schedule 05.03.2018
comment
Работал отлично! Спасибо! - person Wesley S; 05.03.2018