java - 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 实现不支持初始握手后的身份验证,因此与可选的客户端身份验证不兼容
请问是什么意思?
危险吗”?
请问怎么修?
谢谢
解决方案
握手后客户端身份验证是 RFC8446 中定义的 TLSv1.3扩展。但是 OpenJDK 没有实现它,也不会实现它。相应的问题被标记为“不会修复”。
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
,WANT
和NEED
.
如果您不使用客户端证书,请将其设置为NONE
. 如果您使用客户端证书,请检查每个客户端是否可以使用该NEED
值正确验证自己。如果您保留它,唯一的风险是使用握手后身份验证的客户端将无法进行身份验证。
如果您确实需要握手后客户端身份验证,则必须使用除JSSE之外的另一个 TLS 实现。您可以使用反向代理,例如Apache、 NGINX 、Traefik ,也可以使用Tomcat 的APR / OpenSSL本地绑定。您可以阅读一篇有趣的文章:Tomcat Native / OpenSSL in Spring Boot 2.0
推荐阅读
- symfony - 无法转发到不同bunde symfony的路由方法控制器
- mysql - 在文件中加载数据,在 csv 文件中的主键更新列的副本上
- machine-learning - BigQuery 拆分数据集偏差
- javascript - redux-persists 不适用于反应本机应用程序
- jquery - FlaskForm 模态提交自定义验证器未调用
- r - 在 R studio 中安装 xlsx 包
- angular - 如何使用 Angular 6 中的智能表将数据更新到另一个页面
- angular - 如何动态填充表格列和行中的数据
- spring - Reactor BubblingException 代替自定义异常
- nginx - nginx: server_name 正则表达式和通配符 server_name 同时