为Java Web应用程序完成智能卡身份验证的位置?

时间:2016-04-07 13:29:10

标签: java authentication smartcard cac josso

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

我的理解是,理想情况下,您需要与执行身份验证的应用程序分离的网关。一个简单的例子是F5硬件/软件包。一旦用户使用他们的CAC / pin组合进行身份验证,他们就会转发到Weblogic上的已部署应用程序,并在其标题中添加一些其他信息(如前面提到的AD角色)。我并不是说我应该购买它,因为没有可编程的解决方案,而是作为一个例子,认证和使用资源是两个单独的实体,并且不应该必然结合这个问题。

但实际上,我已经读过许多项目正在将Microsoft和Apache服务结合起来以允许身份验证。 Here is a good blog post that outlines some benefits.用户对IIS进行身份验证后,会将其转发到apache上的应用程序。无论如何,混合使用IIS和Weblogic似乎是一个糟糕的主意,特别是在尝试配置两个节点之间的通信时。

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

  

您可以在服务器时指定一组可接受的证书策略   验证客户端证书

虽然答案在一般意义上是有道理的,但作者从未详细说明此通信的架构细节。其他一些帖子推荐JOSSO,以执行SSO功能,如前面提到的网关机制。这篇文章还讨论了如何使用PKCS11直接使用制造商提供的驱动程序来读取智能卡。还有一些问题没有答案,例如Authenticating AD server user using DOD issued CAC in java

考虑到其中一些帖子之间平均有5年的时间,我不确定今天的最佳做法是什么。网关是否是进行身份验证的理想方式?我的想法根本不适用,并且存在更好的解决方案吗?

1 个答案:

答案 0 :(得分:2)

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

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

  

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

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

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

注意:

  • 您可以设置Weblogic以直接支持客户端证书身份验证,但我建议使用代理(F5,Apache,IIS,...),以便您在一个点上管理可信CA.

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

  

在什么阶段执行CAC / AD身份验证,如果所有这些   应用需要它吗?

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

  

网关是否是进行身份验证的理想方式?是我的   根本不适用的想法和更好的解决方案?

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

另一个选择是使用身份服务器,它为您提供与外部(云)服务集成的优势。但是 - 它是一个单独的服务器,包含所有麻烦(部署,维护,知识......)

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

我希望它有所帮助,carpe diem