Java Web 应用程序的智能卡身份验证在哪里完成?

Where is smart card authentication done for Java Web apps?

试图确定 CAC/Active 目录 (AD) 身份验证在何处对基于 Java 的 Web 应用程序发挥作用时,我感到很困惑。以托管在多个 Weblogic 容器上的多个 J2E JSF 应用程序为例。这些应用程序中的每一个都通过检查用户所处的 AD 角色来限制用户的访问。如果所有这些应用程序都需要,在什么阶段执行 CAC/AD 身份验证?

据我了解,理想情况下,您希望网关与执行身份验证的应用程序分开。一个简单的例子是 F5 hardware/sotware bundle。一旦用户使用他们的 CAC/pin 组合进行身份验证,他们将被转发到 Weblogic 上部署的应用程序,并在他们的 headers 中提供一些附加信息(如前面提到的 AD 角色)。我并不是说我应该购买它,因为没有可编程的解决方案,而是作为一个例子,身份验证和使用资源是两个独立的实体,不必为了这个问题而结合起来。

然而,在实践中,我了解到许多项目正在结合 Microsoft 和 Apache 服务以允许进行身份验证。 Here is a good blog post that outlines some benefits. 一旦用户根据 IIS 进行身份验证,他们将被转发到 apache 上的应用程序。无论如何,混合使用 IIS 和 Weblogic 似乎是一个糟糕的主意,尤其是在尝试配置两个节点之间的通信时。

堆栈和网络上也有许多帖子,可以追溯到 2012 年之前,推荐不同的解决方案。 One post recommends the following:

you can specify set of acceptable certificate policies when the server validates the client certificate

虽然一般来说答案是有道理的,但作者从未深入探讨进行此交流的架构细节。其他一些帖子推荐 JOSSO, to perform SSO functionality like the gateway mechanisam previously mentioned. This post also talks about using PKCS11 for reading smart cards directly by using the manufacturer provided drivers. There are also questions that have no answer, such as Authenticating AD server user using DOD issued CAC in java

考虑到其中一些帖子之间平均间隔 5 年,我不确定今天针对此问题的最佳做法是什么。网关方法是进行身份验证的理想方式吗?难道我的想法根本不适用,还有更好的解决方案吗?

我花了一些时间来提取问题,所以 - 你想达到什么目的?但是 - 让我们试试:

正如您所提到的 CAC/AD - 我假设每个客户端都需要自己的密钥对和签名证书。并且您想使用智能卡(可以托管密钥对和证书)实现 SSO (single-sign-on)。

Where is smart card authentication done for Java Web apps?

智能卡通常用作密钥库(可作为 PKCS11 密钥库访问)。它可能包含几个密钥对和证书。如何使用 - Web 浏览器(大多数浏览器)可以使用智能卡证书与服务器建立相互(双向)SSL。

通常的做法是终止 Web 服务器/代理上的 SSL,并将证书信息 (DN) 作为 HTTP header(例如 x-client-cert)传递到后端服务。 F5 BIGIP 是一个非常好的工具,我们通常为此目的使用 Apache 或 Nginx 作为更简单和更便宜的选择。

注:

  • 您可以 set-up Weblogic 直接支持客户端证书身份验证,但我建议使用代理(F5、Apache、IIS 等),这样您就可以同时管理受信任的 CA单点。

一个完全不同的问题是如何将 HTTP header 转换为用户主体(身份)及其权限/角色。您可以为此目的编写一个 servlet 过滤器,但对于更大的部署,您可以使用身份服务器(F5 APM、WSO2 IS、OpenAM)有效地将客户端证书信息转换为其他协议(SAML、OAuth、.. )

At what stage does one perform CAC/AD authentication, if all of these applications require it?

技术上 - 在建立 SSL 连接时。因此,无论您是将客户端证书信息提供给代理服务器还是身份服务器——这并不重要,这里重要的部分是该信息已提供给所有其他应用程序(作为代理或声明后面的 HTTP header使用 SAML、OAuth、...其他身份验证)。

Is the gateway approach an ideal way to do authentication? Are my ideas not applicable at all and a better solution exists?

网关方法非常普遍和可靠。在传递任何信息之前,不要忘记清理 HTTP headers。

另一种选择是使用身份服务器,它为您提供了与外部(云)服务集成的优势。但是 - 它是一个独立的服务器,周围有很多麻烦(部署、维护、知识……)

另一种选择 - 您可能需要智能卡登录到 AD 客户端工作站,然后使用普通的 SPNEGO (Kerberos) SSO :)

希望对你有所帮助,及时行乐