【问题标题】:Convert private key to PKCS#8 format in java在java中将私钥转换为PKCS#8格式
【发布时间】:2014-03-11 17:34:33
【问题描述】:

我正在尝试使用 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。

【问题讨论】:

  • 我查了发现私钥无法导出,是不是问题的原因?

标签: private-key pkcs#8


【解决方案1】:

以编程方式将 pfx 文件导入 Windows 证书存储区,然后尝试稍后再次读取此证书和密钥时,我遇到了完全相同的问题。我相信答案就在http://www.oracle.com/technetwork/articles/javase/security-137537.html 中,我引用了一句:“......生成的 PKCS#12 密钥库可能不会导入到仅使用单个密码作为密钥库及其所有密钥条目的应用程序中”。在文档的前面它还指出:“请注意,SunMSCAPI 提供程序生成的密钥是本机句柄的包装对象。因此,它们可能不被其他提供程序接受,并且可能与纯 Java 提供程序生成的密钥有些不同,例如作为 SunJCE。尤其是 SunMSCAPI 提供程序生成的 RSA 私钥不能被序列化”。如上所述,尝试读取私钥会导致空算法和空编码数据,尽管读取证书工作正常。或者,您可以将 PrivateKey 保存在单独的 RSA 加密文件中,而不是 Windows 证书存储中,或者只使用原始 pfx 文件,而不是将 pfx 导入 Windows 证书存储。

【讨论】:

  • 谢谢你,正如你所说,或者我直接使用windows商店而不尝试导入它。
【解决方案2】:

我使用如下命令:

Runtime.getRuntime().exec("openssl pkcs8 -topk8 -nocrypt -in "+ privateKeyPath + " -out " + pkcs8PrivateKeyPath)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 2016-09-30
    • 2016-11-01
    • 2011-02-26
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多