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

Pat*_*Pat 6 java tomcat spring-boot tls1.2 tls1.3

关于 Spring Boot MVC with Tomcat 和 TLSv1.3 的问题

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

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

本来以为很简单,可以轻松完成这个任务,我就去修改我的属性:

server.ssl.enabled-protocols=TLSv1.2
Run Code Online (Sandbox Code Playgroud)

server.ssl.enabled-protocols=TLSv1.3
Run Code Online (Sandbox Code Playgroud)

但是,从那时起,我在每个应用程序启动时都会得到这个:

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

请问是什么意思?

危险吗”?

请问怎么修?

谢谢

Ort*_*kni 11

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

\n

该警告由 Tomcat 在SSLUtilBase.java中发出

\n
if (enabledProtocols.contains(Constants.SSL_PROTO_TLSv1_3) &&\n        sslHostConfig.getCertificateVerification() == CertificateVerification.OPTIONAL &&\n        !isTls13RenegAuthAvailable() && warnTls13) {\n    log.warn(sm.getString("sslUtilBase.tls13.auth"));\n}\n
Run Code Online (Sandbox Code Playgroud)\n

isTls13RenegAuthAvailable()方法定义在JSSEUtil.java中

\n
@Override\nprotected boolean isTls13RenegAuthAvailable() {\n    // TLS 1.3 does not support authentication after the initial handshake\n    return false;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

要消除此警告,您可以将Tomcat 的 SSLHostConfig 中的CertificateVerificationNONE设置为或REQUIRED。您可以通过 Spring Boot 属性server.ssl.client-auth来完成此操作,该属性采用值NONEWANTNEED

\n

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

\n

如果您确实需要握手后客户端身份验证,则必须使用JSSE之外的其他 TLS 实现。您可以使用反向代理,例如ApacheNGINXTraefik或使用Tomcat\xe2\x80\x99s 本机绑定进行APR / OpenSSL。您可以阅读一篇有趣的文章:Tomcat Native / OpenSSL in Spring Boot 2.0

\n

== 2023 年 4 月 5 日更新 ==

\n

在OpenJDK 安全开发邮件列表上发布消息后, OpenJDK 问题已重新开放,并且“无法修复”标签已被删除。但是 OpenJDK 中仍然没有实现 TLS 1.3 握手后身份验证。

\n