首页 > 解决方案 > 将客户端证书的 DN 传递给 Tomcat 中部署的应用程序

问题描述

clientAuth="true"我通过在conf/server.xml文件中设置,将 Tomcat 配置为要求通过 TLS 进行相互身份验证:

<Connector 
      port="8443"
      protocol="org.apache.coyote.http11.Http11NioProtocol"
      maxThreads="150"
      SSLEnabled="true"
      scheme="https"
      secure="true"
      keystoreFile="conf/server.p12"
      keystorePass="1t3TcUQY*2j^"
      truststoreFile="conf/cacerts"
      truststorePass="fx!eAKQO2^0c"
      clientAuth="true"
      sslProtocol="TLS"
      sslEnabledProtocols="TLSv1.2">
</Connector>

一切都很好,Tomcat 只接受具有有效证书的客户端。

问题是部署在 Tomcat 中的 Web 应用程序不知道客户端的身份。我所说的身份是指出现在客户证书中的主题信息,例如其专有名称 (DN)。因此,Web 应用程序无法根据客户端的身份做出访问控制决策。

Tomcat有没有办法在成功认证后将此信息传递给部署的我们的应用程序?

标签: securitytomcattls1.2access-controlclient-certificates

解决方案


  1. 客户端证书可作为request.getAttribute("javax.servlet.request.X509Certificate")证书数组访问。阅读Servlet 规范以获取官方参考。在 Servlet 4.0 规范中,即第 3.10 章SSL Attributes

  2. 如果您的应用程序配置了login-config/auth-methodCLIENT-CERT那么 Tomcat 中的 Authenticator 将执行客户端证书的身份验证。实际的处理被委托给一个领域。

    如果认证成功,则从证书中提取用户名并java.security.Principal创建 a。用户名的提取可以通过X509UsernameRetrieverClassNameRealm 的属性进行配置。请参阅领域配置参考

    (供参考,在Tomcat 9中:org.apache.catalina.authenticator.SSLAuthenticator.doAuthenticate (), org.apache.catalina.realm.RealmBase.authenticate (X509Certificate[]))


推荐阅读