2016-04-04 53 views
0

我从JKS中提取了密钥及其证书链,现在我试图使用Java将此密钥添加到Windows密钥存储区。如何通过编程方式将私钥添加到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); 

而且BOOM

线程“main”中的异常java.lang.ClassCastException:[Ljava.security.cert.Certificate;不能转换为[Ljava.security.cert.X509Certificate; (KeyStore.Keyvail),并且在密钥仓库中使用密钥存储区域(KeyStore.setKeyEntry(KeyStore.KeyKey))。 Java的:909)

例外由于抛至调用setKeyEntry电话。

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

回答

3

在sun.security.mscapi.KeyStore.engineSetKeyEntry()的实现中似乎存在着笨拙的java代码。它试图将证书的一个数组(“[Ljava.security.cert.Certificate”,注意类名称中的前缀)转换为X509Certificates(“[Ljava.security.cert.X509Certificate”))的数组,这并不是Java可以让你用简单的表达式来表达的东西(例如,参见discussion也有类似的错误)。

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

相关问题