Post-Handshake Client Authentication is a TLSv1.3 extension defined in RFC8446. But OpenJDK doesn't implement it and will not implement it. The corresponding issue is marked as "Won't fix".
The warning is emitted by Tomcat in SSLUtilBase.java
if (enabledProtocols.contains(Constants.SSL_PROTO_TLSv1_3) &&
sslHostConfig.getCertificateVerification() == CertificateVerification.OPTIONAL &&
!isTls13RenegAuthAvailable() && warnTls13) {
log.warn(sm.getString("sslUtilBase.tls13.auth"));
}
The isTls13RenegAuthAvailable()
method is defined in JSSEUtil.java
@Override
protected boolean isTls13RenegAuthAvailable() {
// TLS 1.3 does not support authentication after the initial handshake
return false;
}
To remove this warning you can either set CertificateVerification in Tomcat's SSLHostConfig to NONE
or to REQUIRED
. You can do it through the Spring Boot property server.ssl.client-auth which take the values NONE
, WANT
and NEED
.
If you don't use client certificates, set it to NONE
. If you use client certificates, check that each client can authenticate itself correctly with the NEED
value. If you leave it as it, the only risk is that client that use post-handshake authentication will not be able to authenticate.
If you really need post-handshake client authentication, you will have to use another TLS implementation than JSSE. You can either use a reverse proxy such as Apache, NGINX, Traefik or use Tomcat’s native bindings for APR/OpenSSL. There is an interesting article you can read about this: Tomcat Native / OpenSSL in Spring Boot 2.0
== Update 5th April 2023 ==
After a message on the OpenJDK security-dev mailing list, the OpenJDK issue has been reopened and the "Won't fix" label has been removed. But the TLS 1.3 Post-handshake authentication is still not implemented in the OpenJDK.