【问题标题】:request client certificate authentication only to some particular resource仅向某些特定资源请求客户端证书身份验证
【发布时间】:2014-03-11 04:12:59
【问题描述】:

我正在 Tomcat 上部署一个 webapp,它最终应该会成为一个提供多种服务的平台。有时我需要能够使用客户端证书对用户进行身份验证,但只有当她访问一些 servlet/url 时,才能验证证书并读取一些属性。

我得出的结论是,单独使用 Tomcat 和 jsp/servlets,不可能只让 web 应用程序的一部分来请求客户端证书身份验证。要么是整个 tomcat 服务器在任何地方都请求用户证书(clientAuth true 或 want),要么是 web.xml 授权设置,对于这种情况没有用处。

我可以使用框架、应用服务器或某些经过验证的特定架构来实现此要求吗?我想也许有一个单独的服务器实例专用于相互 ssl 身份验证、重定向用户和转发会话参数,但这个选项似乎管理起来相当复杂。我敢打赌有类似的解决方案,只是想知道是否有一些参考实现、指南等等......谢谢。

【问题讨论】:

    标签: tomcat authentication servlets ssl x509


    【解决方案1】:

    你不能单独使用 Tomcat 来做到这一点。客户端身份验证最多针对每个 webapp,或者您可以在 server.xml Connector 元素中为整个容器设置它,无论使用什么。

    如果您对每个资源都需要这个,您可以通过在前面使用 Apache HTTPD 并让它终止 SSL 来获得它。 (它仍会将标头中的客户端证书传递给 Tomcat,以便 Tomcat 可以遵守 Servlet 规范,使其可用于 webapps。)然后您几乎可以配置有关 SSL 的所有内容,直至单个文件的级别。这也为您提供了各种其他好处,例如负载平衡。

    【讨论】:

    • 您可以在连接器中使用clientAuth="false",在web.xml 文件中使用<auth-method>CLIENT-CERT</auth-method>:这将使用重新协商。
    • 我想需要一些分布式架构。我看到了类似的平台,带有 cert auth,它们传递了一些 jsessionid 和一堆参数,并通过不同的 url 重定向。我会看看 apache httpd 解决方案,谢谢。
    • @Bruno 是的,每个网络应用程序,而不是每个资源。调整了我的文字。
    【解决方案2】:

    我过去直接使用 Tomcat 完成此操作,使用客户端证书重新协商。配置可能会随着 Tomcat 的更新版本而略有变化,但想法如下:

    • 为客户端身份验证配置您的连接器:设置其信任存储参数,但使用clientAuth="false"。这记录在the Tomcat documentation:

      如果您希望 SSL 堆栈在接受连接之前需要来自客户端的有效证书链,请设置为 true。如果您希望 SSL 堆栈请求客户端证书,则设置为需要,但如果没有提供,则不会失败。除非客户端请求受使用 CLIENT-CERT 身份验证的安全约束保护的资源,否则 false 值(这是默认值)将不需要证书链。

    • 在您的 web.xml 文件中,使用如下内容:

      <web-app>
          <display-name>My Webapp</display-name>
          <security-constraint>
              <web-resource-collection>
                  <web-resource-name>App</web-resource-name>
                  <url-pattern>/</url-pattern>
              </web-resource-collection>
              <auth-constraint>
                  <role-name>cert</role-name>
              </auth-constraint>
              <user-data-constraint>
                  <transport-guarantee>CONFIDENTIAL</transport-guarantee>
              </user-data-constraint>
          </security-constraint>
      
          <login-config>
              <auth-method>CLIENT-CERT</auth-method>
          </login-config>
      
          <security-role>
              <role-name>cert</role-name>
          </security-role>
      </web-app>
      

      当然,将 web-resource-collection 调整为您需要的 URL 模式。

    【讨论】:

    • 谢谢。好吧,我尝试了类似的东西(如果实际上不一样的话),但是证书中的用户必须属于一个角色,之前在 tomcat 中定义,所以它不是很灵活/可扩展。
    • 你肯定需要更进一步的角色,不是吗?如果您想允许您的 CA 接受任何证书,只需创建您自己的领域,为所有进入的证书(并且具有您需要的属性)分配一个共同的基本角色:tomcat.apache.org/tomcat-7.0-doc/…
    • 'web-resource-name' 元素中的 'App' 对应什么?它是否必须映射 WAR(等)的名称 - 或者它是一个“abritary”标签?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 2015-02-26
    • 2011-04-09
    • 2013-10-07
    • 1970-01-01
    • 2022-06-23
    相关资源
    最近更新 更多