我从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上使用相同的语法时,不会抛出任何异常。
答案 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()方法调用,而不是简单的证书数组。