【问题标题】:Where is smart card authentication done for Java Web apps?Java Web 应用程序的智能卡身份验证在哪里进行?
【发布时间】:2016-07-28 10:10:32
【问题描述】:

我很难确定 CAC/Active Directory(AD) 身份验证在哪里对基于 Java 的 Web 应用程序起作用。以托管在多个 Weblogic 容器上的多个 J2E JSF 应用程序为例。这些应用程序中的每一个都通过检查用户所处的 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 年,我不确定今天针对此问题的最佳做法是什么。网关方法是进行身份验证的理想方法吗?难道我的想法根本不适用,有更好的解决方案吗?

【问题讨论】:

    标签: java authentication smartcard cac josso


    【解决方案1】:

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

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

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

    智能卡通常用作密钥库(可作为 PKCS11 密钥库访问)。它可能包含多个密钥对和证书。如何使用 - 网络浏览器(大多数)可以使用智能卡证书与服务器建立双向(2 路)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 :)

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

    【讨论】:

    • 感谢您的反馈。您肯定在回答我在问题中提出的问题。我对您的帖子提出的关于此声明的问题“通常的做法是终止 Web 服务器/代理上的 SSL,并将证书信息 (DN) 作为 HTTP 标头传递给后端服务”这是否意味着 SSL在tomcat和F5之间不使用例如,以便可以读取那些标题?我之前和 F5 的人谈过,据说它可以在 tomcat 和 f5 可以通信的地方传递和解码 ssl 信息。但是,我对此知之甚少
    • 客户端证书是 SSL 的一部分,仅适用于第一个 SSL 终止端点 (F5)。 F5 可以提取证书并使用 iRule 将其设置为 HTTP 标头。在许多情况下,F5 背后的流量被认为是安全的,不需要加密。但是 - 您可以在 F5 和您的应用服务器 (Tomcat) 之间建立一个普通的 SSL 通道。只是客户端(用户)证书作为 HTTP 标头进一步传递,您的应用程序需要信任标头值。
    • 只是为了确保我理解正确,如果您在 F5 和 tomcat 之间建立 ssl 通道,那么您在 tomcat 上从 F5 接收到的标头将使用这两个实体之间的证书进行加密和解密。这绝对是可取的,因为老实说,我不认为客户端证书应该传播到应用程序,除非需要它们。我宁愿我的应用信任我们同意的 F5 证书,而不是管理客户之间的关系。
    • 基本上你是对的。用户客户端和应用程序本身之间不应该有直接的“隧道”。 F5 可以做很多安全、负载均衡、卸载,.. 你需要将客户端证书信息传播到应用服务器(以标头的形式),而不是 SSL 连接(请不要混合这些)。
    • 没错。我现在完全理解你了。感谢您抽出宝贵时间提供文章。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    • 2017-03-03
    相关资源
    最近更新 更多