Hi, We are in process of migrating from Tomcat 7 to Tomcat 9. We use cert-based client authentication in our application, support password-based and cert-based authentication.
For this purpose, we are setting certificateVerification="optional" attribute in SSLHostConfig Element of Server.xml [in Tomcat 7, we were setting clientAuth="want" ] <Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" compression="on" compressibleMimeType="text/html,text/xml,text/plain,text/javascript,text/css,application/x-javascript,application/javascript" address="0.0.0.0" maxPostSize="10485760" URIEncoding="UTF-8" server=" "> <SSLHostConfig truststoreFile="${tomcat.bind.truststore}" truststorePassword="${tomcat.bind.truststorepass}" truststoreType="jks" ciphers="TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256" certificateVerification="optional" sslProtocol="TLS" protocols="TLSv1.2"> <Certificate certificateKeystoreFile="${tomcat.bind.keystore}" certificateKeystorePassword ="${tomcat.bind.keystorepass}" type="RSA" /> </SSLHostConfig> </Connector> When I am trying to access application from browser, where client certificate is available, this use case is not working with setting(certificateVerification="optional"), Tomcat is not requesting for client cert. If I change this setting to certificateVerification="required", then this functionality is working as it was working with Tomcat 7. Can someone help in understanding why Tomcat 9, setting with "optional" value not working. As per Tomcat 9 SSLHostConfig documentation<https://tomcat.apache.org/tomcat-9.0-doc/config/http.html#SSL_Support_-_SSLHostConfig>, client authentication with optional setting should work? certificateVerification Set to required if you want the SSL stack to require a valid certificate chain from the client before accepting a connection. Set to optional if you want the SSL stack to request a client Certificate, but not fail if one isn't presented. Set to optionalNoCA if you want client certificates to be optional and you don't want Tomcat to check them against the list of trusted CAs. If the TLS provider doesn't support this option (OpenSSL does, JSSE does not) it is treated as if optional was specified. A none value (which is the default) will not require a certificate chain unless the client requests a resource protected by a security constraint that uses CLIENT-CERT authentication. Regards Manish