我通过在 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 是否有办法在身份验证成功后将此信息传递给已部署的应用程序?
最佳答案
客户端证书可通过
request.getAttribute("javax.servlet.request.X509Certificate")
作为证书数组访问。阅读 Servlet 规范 作为官方引用。在 Servlet 4.0 规范中,第 3.10 章SSL 属性。如果您的应用程序配置了
login-config/auth-method
ofCLIENT-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/