security - 将客户端证书的 DN 传递给 Tomcat 中已部署的应用程序

标签 security tomcat tls1.2 access-control client-certificates

我通过在 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 是否有办法在身份验证成功后将此信息传递给已部署的应用程序?

最佳答案

  1. 客户端证书可通过 request.getAttribute("javax.servlet.request.X509Certificate") 作为证书数组访问。阅读 Servlet 规范 作为官方引用。在 Servlet 4.0 规范中,第 3.10 章SSL 属性

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

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

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

关于security - 将客户端证书的 DN 传递给 Tomcat 中已部署的应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53332497/

相关文章:

php - PHP 开发人员需要了解哪些有关 https/安全套接字层连接的知识?

PHP 在插入 MySQL 时向字符添加斜杠

azure - 如何处理在每个 API 调用中使用 header 身份验证的自定义连接器?

java - ThreadLocal共享数据?

java - 如何检索 SSL 客户端正在使用的 KeyManager、TrustManager 和 SecureRandom 对象?

javascript - 前端的 PCI 合规性 (PCI DSS)

tomcat - 如何使用 auth DIGEST 控制 Tomcat 中的 session 过期

java - 在 websphere 应用程序服务器 8.5.5 上运行 liferay portlet

ssl - OpenSSL TLS/DTLS PSK

ssl - 当服务器是 https 时,有没有办法查看发送的数据?