1

我正在尝试使用用户 CAC 卡上的证书从 Web 服务客户端 (Axis2) 启用 SSL 通信。像魅力一样工作......直到网络服务器启用 CAC。此时,SSL 连接被拒绝,并显示未包含链中其他证书的错误消息。

通过将它添加到 security.properties 文件或以编程方式创建它,我已确保提供程序可用。

我目前的方法是简单地设置系统属性: System.setProperty("javax.net.ssl.keyStore", "NONE"); System.setProperty("javax.net.ssl.keyStoreType", "PKCS11");

我从这个问题/答案中了解到,这种方法只发送“最终实体”证书。显然我需要实现我自己的 X509KeyManager。这对我来说是新的领域,任何人都可以提出一个好的参考或提供如何做到这一点的样本吗?

感谢您的帮助。

4

1 回答 1

1

最佳密钥管理器实施取决于您希望使用的证书的颁发者。

如果用户 CAC 上的证书将始终由特定 CA 颁发,只需将该颁发者的证书和任何中间证书存储在 PKCS #7 文件中。在该getCertificateChain()方法中,可以将该集合盲目地附加到用户的证书中并返回。

如果事情不是那么简单,但可以枚举可能的颁发者的完整列表,获取他们的所有证书,以及他们的颁发者的证书,等等,直到根证书。

将所有根证书作为受信任条目添加到密钥库。将中间证书捆绑在 PKCS-#7 格式的文件中。

实施X509KeyManager(或扩展X509ExtendedKeyManager,如果您正在使用SSLEngine)。具体来说,在该getCertificateChain()方法中,您将使用 aCertPathBuilder创建从用户证书到受信任根的有效链。目标是您使用参数从用户的 CAC 加载的证书alias。受信任的根是您创建的信任库中的证书;中间证书可以从 PKCS #7 文件加载并添加到构建器参数中。构建链后,获取证书路径并将其转换为数组。这是getCertificateChain()方法的结果。

If you can't predict who will be issuing the user's certificate, you might be able to obtain the intermediate certificates at runtime from an LDAP directory or other repository. That's a whole new level of difficulty.

于 2009-12-07T22:58:16.883 回答