如何以编程方式将私钥添加到Windows Cert Store

时间:2016-04-04 15:05:17

标签: java security certificate key keystore

我从JKS中提取了一个Key及其认证链,现在我正在尝试使用Java将此密钥添加到Windows Keystore。

要加载我的JKS,我执行了以下操作:

    String jksPath = "D:\\mykeystore.jks";
    KeyStore keystore = KeyStore.getInstance("JKS");
    FileInputStream fIn = new FileInputStream(jksPath);
    keystore.load(fIn, "12345678".toCharArray());

然后我获得了密钥和认证链:

    Key key = keystore.getKey("res1", "12345678".toCharArray());
    Certificate[] cchain = keystore.getCertificateChain("res1");

到目前为止一切顺利,然后我尝试将此密钥添加到我的Windows密钥库中:

    KeyStore ks = KeyStore.getInstance("Windows-MY");
    ks.load(null, null);
    ks.setKeyEntry("myKey", key, "12345678".toCharArray(), cchain);

BOOM

  

线程“main”中的异常java.lang.ClassCastException:[Ljava.security.cert.Certificate;无法转换为[Ljava.security.cert.X509Certificate;       at sun.security.mscapi.KeyStore.engineSetKeyEntry(KeyStore.java:402)       at sun.security.mscapi.KeyStore $ MY.engineSetKeyEntry(KeyStore.java:62)       在java.security.KeyStore.setKeyEntry(KeyStore.java:909)

由于 setKeyEntry 调用而抛出异常。

P.S:当我在JKS类型的Keystore上使用相同的语法时,不会抛出任何异常。

1 个答案:

答案 0 :(得分:3)

在sun.security.mscapi.KeyStore.engineSetKeyEntry()的实现中,似乎有一些笨拙的java代码。它尝试将数组的证书(&#34; [Ljava.security.cert.Certificate&#34;,注意类名称中的前缀)转换为数组 X509Certificates(&#34; [Ljava.security.cert.X509Certificate&#34;),这不是java允许你使用简单的强制转换表达式(例如,见discussion类似的错误)。< / p>

我在类似情况下所做的就是将证书数组作为X509Certificate数组传递给keyStore.setKeyEntry()方法调用,而不是简单的证书数组。