根据this article公钥和私钥与“正常”RSA密钥没有区别。因此,您可以使用相同的RSAPublicKey
和RSAPrivateCrtKey
作为容器。问题在于KeyStore
的实现非常有限(pkcs#12,jks,jceks) - 它们不能用于存储单个私钥。您需要为公钥创建一个证书链。这可能是一个自签名证书,但存储密钥却相当麻烦。
你也可以创建自己的KeyStore
实现,但这似乎是一个巨大的工作量。在你自己的提供者中实现KeyStoreSpi
稍微不复杂,但它需要你的提供者使用私钥和由Oracle签名的证书进行签名。
基本上我会去上面解释的自签名证书技巧或与邓肯提出的序列化方案。
对于非信徒:
Exception in thread "main" java.lang.IllegalArgumentException: invalid zero-length input chain
at java.security.KeyStore$PrivateKeyEntry.<init>(KeyStore.java:393)
和
Exception in thread "main" java.lang.NullPointerException: invalid null input
at java.security.KeyStore$PrivateKeyEntry.<init>(KeyStore.java:390)
的可能重复[?如何使用密钥库中的Java存储私钥(http://stackoverflow.com/问题/ 9890313 /如何使用密钥存储在java中的存储私钥) – Drunix
@Drunix如果这是一个普通的私钥,这将是一个骗局。现在不是很多。 –
@owlstead:至少在链接帖子中接受的答案显示了如何在不使用密钥库的情况下存储公钥,如果您将密钥的模数和指数设置为BigIntegers。私钥可以做同样的事情。所以如果我们不把它称为完美的重复,那么答案可能非常有用。此外,他们还演示了如何使用KeySpecs将作为组件给定的键转换为键。所以如果OP真的想要使用密钥库,这可能会有所帮助(留下从公钥创建证书的问题)。 – Drunix