【发布时间】:2018-03-28 12:03:06
【问题描述】:
我正在 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 Logon”,我需要使用这个。我通过进入调试器并手动破解证书列表确认了这一点。
问题是:当有重复的别名时,我如何使用 API(例如第二个)获得正确的证书?
如果外部库可以做到这一点,我可以选择。
更多可能有用的细节:
- 我使用 KeyStore,然后创建 KeyStoreManager。
- 我用给定的 keyStoreManager
sslContext.init(keyManagerFactory.getKeyManagers(), ...)初始化 SSLContext - 我使用给定的 ssl 上下文创建 HttpsUrlConnection,这是我的目标。
【问题讨论】:
标签: java authentication ssl encryption keystore