我正在Windows上使用Java中的Web服务器实现相互身份验证。 我在智能卡上有证书,该证书应该用于验证我(或其他用户)。
到目前为止,我已经发现我可以使用Windows-MY密钥库访问证书。 我这样做:
KeyStore keyStore = KeyStore.getInstance("Windows-MY");
keyStore.init(null, null);
这很有效。我可以在keystoreSpi中看到所有证书(在调试器中)。其中一个是我需要使用的 - 我证实了这一点。
问题如下:
KeyStore api允许我只使用它的别名来获取证书。例如keyStore.getCertificate("alias")
或keystore.getCertificateChain("alias")
我注意到此密钥库中有多个具有相同别名的不同证书。我无法更改别名。我只是在物理上得到了带有证书的智能卡。
当我调用上述方法之一时,keystore只返回列表中第一个带有别名的证书。 (通常,在实现中有一个映射,其中别名是它的键,因此忽略所有重复的别名)。
不幸的是,第一个证书的目的是“电子邮件加密”等。第二个证书的目的是“SmartCard登录”,我需要使用它。我确认通过进入调试器并手动黑客攻击证书列表。
问题是:如果有重复的别名,我如何使用API(例如第二个)获得正确的证书?
如果可以通过外部库完成,我可以选择。
更多可能有用的细节:
sslContext.init(keyManagerFactory.getKeyManagers(), ...)
答案 0 :(得分:1)
这已经修复了一段时间。只需更新到最近的JRE。有关详细信息,请参阅此处:https://bugs.java.com/bugdatabase/view_bug.do?bug_id=6483657