【问题标题】:How to add a private key to Windows Cert Store programmatically如何以编程方式将私钥添加到 Windows Cert Store
【发布时间】:2016-07-24 05:00:41
【问题描述】:

我从 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 调用而引发异常。

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

【问题讨论】:

    标签: java windows security certificate keystore


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-12-04
      • 1970-01-01
      • 2011-08-22
      • 2013-12-30
      • 1970-01-01
      • 2013-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多