Java Kryonet RSAPublicKeyImpl未注册

时间:2018-03-04 23:35:59

标签: java kryo kryonet

我尝试使用chokidar从Kryonet服务器向客户端发送PublicKey(java.security.PublicKey),这样做时会出现此异常:

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)

我还没有在我的代码中的任何地方使用过RSAPublicKeyImpl,而且我似乎无法在我使用的库中的任何地方找到它。

1 个答案:

答案 0 :(得分:0)

可能不是一个完整的答案,但是评论太多了。

Java加密(JCA / JCE)发布(文档)一系列通用' facade'类似Signature Cipher Key等类,但各种算法和变体的实际实现类由一组可变的cryptoproviders提供,可能因cryptoproviders或版本而异,并且不会发布或稳定 - 除了一致性到他们的父类和OO规则所需的接口。很多但并非所有这些实现类都在sun.*com.sun.*下。

通常的Java序列化和反序列化未定义为可用于加密对象。 传输或存储密钥的正确方法不是使用密钥对象,而是使用密钥的编码,这是一个标准化的字节序列,定义为在实现之间保持稳定和版本。

在发件人中,您可以调用由Key.getEncoded()PublicKey等继承的PrivateKey,尽管他们使用的编码不同(分别为X.509和PKCS#8)和发送结果字节。在接收器中使用KeyFactory.getInstance(algorithm[,provider])获取正确算法的密钥工厂,然后分别使用包含X的.generatePublic.generatePrivate来呼叫X509EncodedKeySpecPKCS8EncodedKeySpec。 509或PKCS#8编码。注意接收器需要知道算法,可能需要另外发送;这在技术上是多余的,因为算法标识符包含在(标准)PKCS#8和X.509编码中,但不易于提取。

我不知道如何(或是否)将其与kryo整合。

请注意,支持外部化未加密的私钥,但通常不安全。通常最好在KeyStore中传输或存储包含私钥的密钥对,该密钥使用.store.load以加密形式从流(通常是文件)序列化或反序列化。 。虽然公钥不需要加密,但是通常不通过身份验证来传输或存储它们是不安全的,这通常是通过将它们放入证书中来完成的,通常是X.509v3证书,类似地编码作为字节序列(实际上已广泛实现)。