我正在尝试使用MSCAPI提供程序从Windows证书存储区获取证书和私钥,然后我需要将它们存储在Java Keystore对象中,但我遇到私钥格式问题,错误说:
java.security.KeyStoreException: Cannot get key bytes, not PKCS#8 encoded
这是我的代码:
SunMSCAPI providerMSCAPI = new SunMSCAPI();
Security.addProvider(providerMSCAPI);
KeyStore ks = KeyStore.getInstance("Windows-MY");
ks.load(null, null);
PrivateKey privateKey = null;
X509Certificate cert = null;
cert = (X509Certificate) ks.getCertificate("ALIAS");
if (ks.isKeyEntry("ALIAS")) {
privateKey = (PrivateKey) ks.getKey("ALIAS", null);
}
KeyStore newKs = null;
...
...
newKs .setKeyEntry("pvKey", privateKey , "pwd".toCharArray(), certifChain);
此外,privateKey.getEncoded()
返回null。
答案 0 :(得分:2)
当以编程方式将pfx文件导入Windows证书存储区然后尝试再次读取此证书和密钥时,我遇到了完全相同的问题。我相信答案在于http://www.oracle.com/technetwork/articles/javase/security-137537.html并且我引用:" ...生成的PKCS#12密钥库可能无法导入到仅使用密钥库及其所有密钥条目的单个密码的应用程序中。 ;。在文档的前面,它还指出:"请注意,SunMSCAPI提供程序生成的密钥是本机句柄的包装对象。因此,它们可能不被其他提供者接受,并且可能与由纯Java提供者(例如SunJCE)生成的密钥有所不同。特别是,SunMSCAPI提供程序生成的RSA私钥无法序列化#34;。尝试读取私钥导致空算法和空编码数据,如上所述,虽然阅读证书工作正常。或者,您可以将PrivateKey保存在单独的RSA加密文件中,而不是Windows证书存储中,或者仅使用原始pfx文件,而不是将pfx导入Windows证书库。
答案 1 :(得分:1)
我使用如下命令:
Runtime.getRuntime().exec("openssl pkcs8 -topk8 -nocrypt -in "+ privateKeyPath + " -out " + pkcs8PrivateKeyPath)