从Windows密钥库访问中间CA的Java?

Mer*_*ter 8 java windows x509certificate

我需要在Windows上构建证书链,从X.509智能卡证书到一个或多个中间CA到根CA. 当CA证书位于JKS密钥库中时,这很容易,但我也需要使用Windows密钥库.

我可以从"Windows-ROOT"获得根CA证书,但我无法访问"中级证书颁发机构"密钥库.

有没有人这样做过?

谢谢!

Jcs*_*Jcs 9

SunMSCAPI加密提供程序仅支持两个密钥库:( Windows-MY个人证书存储区)和Windows-ROOT(受信任的机构证书存储区),因此我认为不可能直接访问其他Windows证书存储区.但是它可能没有必要,因为Windows-MY密钥库似乎能够使用来自其他商店的证书构建证书链.

这是我用来测试它的代码片段:

KeyStore ks = KeyStore.getInstance("Windows-MY");
ks.load(null, null) ;
Enumeration en = ks.aliases() ;
while (en.hasMoreElements()) {
    String aliasKey = (String)en.nextElement() ;
    Certificate c = ks.getCertificate(aliasKey) ;
    System.out.println("---> alias : " + aliasKey) ;
    if (ks.isKeyEntry(aliasKey)) {
        Certificate[] chain = ks.getCertificateChain(aliasKey);
        System.out.println("---> chain length: " + chain.length);
        for (Certificate cert: chain) {
            System.out.println(cert);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我在个人证书存储区中添加带有私钥的单个证书,则链长为1.在中间CA证书存储区中添加CA后,我再次启动该程序,链长现在为2.

更新(4月2日) 可以在Windows-MY和Windows-ROOTkeystore中以编程方式添加证书,但有一些限制:

  • 当Windows-ROOT在用户中添加证书时,系统会提示您进行确认
  • 在Windows-MY密钥库中添加的所有证书都是TrustedCertificateEntry(从密钥库的角度来看,不是Windows的观点).密钥库似乎构建了具有所有可用证书的最长链.
  • 在Windows证书存储浏览器中看不到没有关联私钥的证书,但可以通过编程方式删除它们.

在密钥库中添加证书非常简单:

Certificate c = CertificateFactory.getInstance("X.509").generateCertificate(new FileInputStream("C:/Users/me/Downloads/myca.crt"));
KeyStore.TrustedCertificateEntry entry = new KeyStore.TrustedCertificateEntry(c);
ks.setEntry("CA1", entry , null);
Run Code Online (Sandbox Code Playgroud)