首页 > 解决方案 > SpringBoot MVC - 警告:org.apache.tomcat.util.net.SSLUtilBase:JSSE TLS 1.3 实现不支持身份验证

问题描述

一个关于 Spring Boot MVC with Tomcat and TLSv1.3 的问题

我曾经有一个 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 实现不支持初始握手后的身份验证,因此与可选的客户端身份验证不兼容

请问是什么意思?

危险吗”?

请问怎么修?

谢谢

标签: javaspring-boottomcattls1.2tls1.3

解决方案


握手后客户端身份验证是 RFC8446 中定义的 TLSv1.3扩展。但是 OpenJDK 没有实现它,也不会实现它。相应的问题被标记为“不会修复”。

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;
}

要删除此警告,您可以将Tomcat 的 SSLHostConfig 中的CertificateVerificationNONE设置为或REQUIRED。您可以通过 Spring Boot 属性server.ssl.client-auth来实现,它采用NONE,WANTNEED.

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

如果您确实需要握手后客户端身份验证,则必须使用除JSSE之外的另一个 TLS 实现。您可以使用反向代理,例如Apache、 NGINX 、Traefik ,可以使用Tomcat 的APR / OpenSSL本地绑定。您可以阅读一篇有趣的文章:Tomcat Native / OpenSSL in Spring Boot 2.0


推荐阅读