将客户端证书的 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?
客户端证书可作为 request.getAttribute("javax.servlet.request.X509Certificate")
作为证书数组访问。阅读 Servlet 规范 作为官方参考。在第 3.10 章的 Servlet 4.0 规范中 SSL Attributes.
如果您的应用程序配置了 login-config/auth-method
或 CLIENT-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[]))
我通过在 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?
客户端证书可作为
request.getAttribute("javax.servlet.request.X509Certificate")
作为证书数组访问。阅读 Servlet 规范 作为官方参考。在第 3.10 章的 Servlet 4.0 规范中 SSL Attributes.如果您的应用程序配置了
login-config/auth-method
或CLIENT-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[]))