将客户端证书的 DN 传递到 Tomcat 中部署的应用程序

Passing the DN of client's certificate to the deployed app in Tomcat

我通过在 conf/server.xml 文件中设置 clientAuth="true",将 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 在成功验证后将此信息传递给已部署的 we app?

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

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

    如果身份验证成功,将从证书中提取用户名并创建 java.security.Principal。用户名的提取可使用 Realm 的属性 X509UsernameRetrieverClassName 配置。参见 Realm configuration reference

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