SpringBoot MVC - 警告:org.apache.tomcat.util.net.SSLUtilBase:JSSE TLS 1.3 实现不支持身份验证

SpringBoot MVC - Warning: org.apache.tomcat.util.net.SSLUtilBase : The JSSE TLS 1.3 implementation does not support authentication

关于 Spring 使用 Tomcat 和 TLSv1.3

引导 MVC 的问题

我曾经有一个 Spring Boot MVC,基于 Tomcat 的 Web 应用程序,具有非常简单的业务逻辑,通过 ssl HTTPS。

根据安全团队的审查,我不得不将 TLS 版本从 TLSv1.2 升级到 TLSv1.3。

本来以为很简单,很容易就可以完成这个任务,我去改了我的属性:

server.ssl.enabled-protocols=TLSv1.2

server.ssl.enabled-protocols=TLSv1.3

但是,从那时起,我在每次启动应用程序时都会收到此消息:

org.apache.tomcat.util.net.SSLUtilBase:JSSE TLS 1.3 实现不支持初始握手后的身份验证,因此与可选的客户端身份验证不兼容

请问这是什么意思?

“危险”吗?

请问如何解决?

谢谢

Post-握手客户端身份验证是 RFC8446. But OpenJDK doesn't implement it and will not implement it. The corresponding issue 中定义的 TLSv1.3 扩展,标记为“不会修复”。

警告由 Tomcat 在 SSLUtilBase.java

中发出
if (enabledProtocols.contains(Constants.SSL_PROTO_TLSv1_3) &&
        sslHostConfig.getCertificateVerification() == CertificateVerification.OPTIONAL &&
        !isTls13RenegAuthAvailable() && warnTls13) {
    log.warn(sm.getString("sslUtilBase.tls13.auth"));
}

isTls13RenegAuthAvailable()方法定义在JSSEUtil.java

@Override
protected boolean isTls13RenegAuthAvailable() {
    // TLS 1.3 does not support authentication after the initial handshake
    return false;
}

要删除此警告,您可以设置 CertificateVerification in Tomcat's SSLHostConfig to NONE or to REQUIRED. You can do it through the Spring Boot property server.ssl.client-auth,它采用值 NONEWANTNEED

如果您不使用客户端证书,请将其设置为 NONE。如果您使用客户端证书,请检查每个客户端是否可以使用 NEED 值正确验证自己。如果您保留它,唯一的风险是使用 post-握手身份验证的客户端将无法进行身份验证。

如果您真的需要 post-握手客户端身份验证,您将不得不使用不同于 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

的其他 TLS 实现