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

标签 java authentication smartcard cac josso

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

据我了解,理想情况下,您希望网关与执行身份验证的应用程序分开。一个简单的例子是 F5 硬件/软件 bundle 。一旦用户使用他们的 CAC/pin 组合进行身份验证,他们将被转发到 Weblogic 上部署的应用程序,并在他们的 header 中添加一些附加信息(如前面提到的 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 ,以执行 SSO 功能,如前面提到的网关机制。这篇文章还讨论了使用 PKCS11使用制造商提供的驱动程序直接读取智能卡。也有没有答案的问题,比如Authenticating AD server user using DOD issued CAC in java .

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

最佳答案

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

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

Where is smart card authentication done for Java Web apps?

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

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

注意:

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

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

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

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

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

关于java - Java Web 应用程序的智能卡身份验证在哪里完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36477691/

相关文章:

c - OpenSC 与 openCryptoKI

tags - 读取EMV卡序列号

java - Spring @RestController 调用大量请求

java - Android动态TabView使用JSON配置文件

java - JSF渲染: condition of EL statement incorrect

reactjs - 如何在 react 应用程序中检测过期的用户 session ?

java - Android应用程序,如何登录网站并显示信息?

Java GNU GetOpt : Understanding LongOpt's StringBuffer flag

ruby-on-rails - 设计 - Omniauth - 如果用户通过 Facebook 登录,则 Conceal 密码字段

apache - 使用智能卡的 SSL 客户端身份验证