Java 如何以编程方式向Windows证书存储添加私钥

Java 如何以编程方式向Windows证书存储添加私钥,java,windows,security,certificate,keystore,Java,Windows,Security,Certificate,Keystore,我从JKS中提取了一个密钥及其证书链,现在我正试图使用Java将该密钥添加到Windows密钥库中 要加载我的JKS,我执行了以下操作: String jksPath = "D:\\mykeystore.jks"; KeyStore keystore = KeyStore.getInstance("JKS"); FileInputStream fIn = new FileInputStream(jksPath); keystore.load(fIn, "12345

我从JKS中提取了一个密钥及其证书链,现在我正试图使用Java将该密钥添加到Windows密钥库中

要加载我的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);

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

由于setKeyEntry调用引发异常


p.S:当我在JKS类型的密钥库上使用相同的语法时,不会引发异常。

在sun.security.mscapi.Keystore.engineSetKeyEntry()的实现中似乎有一点笨拙的java代码。它试图转换一个证书数组(“[Ljava.security.cert.Certificate”),注意类名中的前缀)指向X509Certificates(“[Ljava.security.cert.X509Certificate”)的数组(“[Ljava.security.cert.X509Certificate”),java不允许您使用简单的强制转换表达式(例如,请参阅类似错误的示例)


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

在sun.security.mscapi.keyStore.engineSetKeyEntry()的实现中似乎有一些笨拙的java代码。它尝试将证书的数组(“[Ljava.security.cert.Certificate”,注意类名中的前缀)转换为X509Certificates的数组([Ljava.security.cert.X509Certificate”),java不允许您使用简单的强制转换表达式(例如,请参阅类似错误)

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