使用 CLIENT-CERT 保护 tomcat 8.5 中的网络资源

Protecting webresource in tomcat 8.5 with CLIENT-CERT

我是 tomcat 的新手,我使用 tomcat 8.5 使用 Spring 框架编写了一些 Web 服务。我想使用身份验证类型 CLIENT-CERT 保护特定的 Web 资源。我已将 server.xml 配置为

        <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
        maxThreads="150" scheme="https" secure="true"
        clientAuth="false" sslProtocol="TLS"
        keystoreFile="<path>/TestServerp12.pfx"
        truststoreFile="<path>/truststore.jks"
        truststorePass="****"
        keystoreType="PKCS12"
        truststoreType="JKS"
        keystorePass="******" />

在下面添加 web.xml

    <security-constraint>
            <web-resource-collection>
                <web-resource-name>App</web-resource-name>
                <url-pattern>/authenticate/*</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>

我关注了一些博客,例如 https://twoguysarguing.wordpress.com/2009/11/03/mutual-authentication-with-client-cert-tomcat-6-and-httpclient/ 和关于它的 Whosebug 问题。

使用上面的配置,protected URL 抛出 403 所以我必须在 web.xml

中添加安全角色
    <security-role>
            <role-name>cert</role-name>
        </security-role>

    and below in tomcat users

    <role rolename="cert"/>
        <user username="EMAILADDRESS=testclient3@email.com, CN=TestClient3, OU=Test, O=MyO, L=TestL, ST=TestST, C=LA" password="null" roles="cert"/>

添加后,它的 SSL 握手成功,但用户名(客户端证书的可分辨名称)被硬编码,这实际上意味着其他用户将无法访问它。

在 tomcat 中启用 CLIENT-CERT 身份验证而不对用户进行硬编码的方法是什么?

您可以在没有任何外部实用程序的情况下执行此操作。从你的问题中并不清楚你到底想做什么。您真正想要做的是将所有用户视为一个单独的组,而不必明确地将每个用户置于该角色中(例如使用用户数据库)。

这可以使用 Tomcat 的 allRolesMode 来完成,您可以在 Realm section of the Tomcat users guide.

中阅读有关内容
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
    allRolesMode="authOnly"
    resourceName="UserDatabase" />

现在在您的 WEB-INF/web.xml 中,您将 <security-constraint> 设置为需要 "any role":

<security-constraint>
  <web-resource-collection>
    <web-resource-name>My Secure Area</web-resource-name>
    <url-pattern>/secure</url-pattern>
  </web-resource-collection>
  <user-data-constraint>
    <transport-guarantee>CONFIDENTIAL</transport-guarantee>
  </user-data-constraint>
  <auth-constraint>
      <role-name>*</role-name>
  </auth-constraint>
</security-constraint>

此技术适用于所有当前支持的 Apache Tomcat (6.0 - 9.0) 版本。