security - 将客户端证书的 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有没有办法在成功认证后将此信息传递给部署的我们的应用程序?
解决方案
客户端证书可作为
request.getAttribute("javax.servlet.request.X509Certificate")
证书数组访问。阅读Servlet 规范以获取官方参考。在 Servlet 4.0 规范中,即第 3.10 章SSL Attributes。如果您的应用程序配置了
login-config/auth-method
,CLIENT-CERT
那么 Tomcat 中的 Authenticator 将执行客户端证书的身份验证。实际的处理被委托给一个领域。如果认证成功,则从证书中提取用户名并
java.security.Principal
创建 a。用户名的提取可以通过X509UsernameRetrieverClassName
Realm 的属性进行配置。请参阅领域配置参考。(供参考,在Tomcat 9中:org.apache.catalina.authenticator.SSLAuthenticator.doAuthenticate (), org.apache.catalina.realm.RealmBase.authenticate (X509Certificate[]))
推荐阅读
- rgraph - RGraph V5 升级 - 获取上下文时出错
- php - 使用迭代返回 for 循环的结果
- android - 为什么我的 android 选项卡布局不起作用?
- azure - 如何在 kubernetes 中从 Angular 应用程序调用 .net core web api
- algorithm - 装袋分类器(平均)如何工作?
- c# - C#相同输入的不同结果
- c++ - 如何使用基于范围的 for 循环迭代器?
- node.js - 如何为 Netlify CMS 编写 config.yml 以自动将博客条目放入 Gatsby 项目中的“posts”文件夹?
- python - 获取错误 add() 在 django 中得到了一个意外的关键字参数 'id'
- spring-boot - Spring Boot:应用程序无法启动