【问题标题】:Sending Complete Chain from Common Access Card (CAC)?从通用访问卡 (CAC) 发送完整的链?
【发布时间】:2010-12-24 04:52:51
【问题描述】:

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

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

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

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

感谢您的帮助。

【问题讨论】:

  • 您确定要在这里讨论 CAC 卡吗?

标签: security jaas webservice-client pkcs#11 cac


【解决方案1】:

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

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

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

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

实现X509KeyManager(如果您正在使用SSLEngine,则扩展X509ExtendedKeyManager)。具体来说,在getCertificateChain() 方法中,您将使用CertPathBuilder 创建从用户证书到受信任根的有效链。 target 是您使用alias 参数从用户的CAC 加载的证书。 trusted roots 是您创建的信任库中的证书;中间证书可以是来自 PKCS #7 文件的 loadedadded to the builder parameters. 构建链后,get the certificate pathconvert it 到一个数组。这是getCertificateChain() 方法的结果。

如果您无法预测谁将颁发用户的证书,您或许可以在运行时从 LDAP 目录或其他存储库获取中间证书。这是一个全新的难度级别。

【讨论】:

  • 如果您知道中间件并控制您要连接的服务器,那么您可以将所需的中间件添加到服务器配置中,而不是更改客户端。
  • 可能。这取决于服务器。当服务器配置不完整的链时,客户端将其视为错误并非没有道理。同样,对客户端身份验证有相同的期望也是合理的。在这个问题中,发帖人表示他们控制着客户,并在实施关键管理器方面寻求帮助——这种方法可以满足提供完整链的期望。
  • 感谢您的反馈。我将尝试使用常规套接字,然后弄清楚如何将相同的更改插入到 Axis2 配置中。
猜你喜欢
  • 2011-04-14
  • 2015-10-11
  • 2011-03-27
  • 2015-04-12
  • 2011-04-04
  • 2014-03-02
  • 2021-08-27
  • 2013-05-02
  • 1970-01-01
相关资源
最近更新 更多