我通过在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是否可以通过成功的身份验证将此信息传递给已部署的我们应用程序?
答案 0 :(得分:1)
客户端证书可以request.getAttribute("javax.servlet.request.X509Certificate")
的形式作为证书数组进行访问。阅读 Servlet规范以获得官方参考。在Servlet 4.0规范中,即第3.10章 SSL属性。
如果您的应用程序配置了login-config/auth-method
中的CLIENT-CERT
,则Tomcat中的Authenticator将执行客户端证书的身份验证。实际的处理将委派给领域。
如果身份验证成功,则会从证书中提取用户名并创建一个java.security.Principal
。可以使用领域的属性X509UsernameRetrieverClassName
配置用户名的提取。参见Realm configuration reference。
(供参考,在Tomcat 9中:org.apache.catalina.authenticator.SSLAuthenticator.doAuthenticate(),org.apache.catalina.realm.RealmBase.authenticate(X509Certificate []))