Spring Boot 2 tomcat ssl握手缓存

Posted

技术标签:

【中文标题】Spring Boot 2 tomcat ssl握手缓存【英文标题】:Spring boot 2 tomcat ssl handshake caching 【发布时间】:2020-09-01 17:50:43 【问题描述】:

使用 nginx 可以像这样缓存 ssl 握手 (https://docs.nginx.com/nginx/admin-guide/security-controls/terminating-ssl-tcp/):

ssl_session_cache     shared:SSL:20m;
ssl_session_timeout   4h;

是否可以在 SpringBoot 2 中使用 Tomcat 做同样的事情?

我之所以问,是因为在我们的性能测试期间,我们看到了如下错误(使用 Gatling):

 j.n.ConnectException: handshake timed out 

如果没有,还有其他选择可以帮助我吗? 谢谢

【问题讨论】:

【参考方案1】:

Java 的 JSSE 已经有 20480 个条目的默认会话缓存,有效期为 24 小时。

如果您想更改这些值:

在全局级别上,您可以将系统属性javax.net.ssl.sessionCacheSize 设置为所需的缓存大小(参见customizing JSSE), 在外部Tomcat中,可以使用<SSLHostConfig>元素的属性sessionCacheSizesessionTimeout, 当你使用嵌入式Tomcat服务器时,你可以定义一个TomcatConnectorCustomizer,例如
@Component
public class SSLSessionCustomizer implements TomcatConnectorCustomizer 

   @Override
   public void customize(Connector connector) 
      for (final SSLHostConfig hostConfig : connector.findSslHostConfigs()) 
         hostConfig.setSessionCacheSize(40960);
         hostConfig.setSessionTimeout(2 * 24 * 60 * 60);
      
   

备注:您可以使用openssl s_client -reconnect 来测试会话恢复。然而,在最近的 Java 版本中,如果缺少 TLS 扩展 extended_master_secret(参见 release notes),JSSE 会中止会话恢复。较旧的客户端(例如基于 OpenSSL 1.0 的客户端)不支持此扩展。如果兼容性对您很重要,您可以设置系统属性:

jdk.tls.useExtendedMasterSecret=false

【讨论】:

以上是关于Spring Boot 2 tomcat ssl握手缓存的主要内容,如果未能解决你的问题,请参考以下文章

在 Apache SSL 代理后面嵌入 Tomcat 的 Spring Boot

运行带有 SSL 和同时未加密的 Spring Boot 应用程序(嵌入式 Tomcat)

如何在没有 SSL 配置的情况下使用 spring boot 和 tomcat 启用 http2

Spring boot 2 embed tomcat 9.0.26 无法加载jks文件流关闭

Https系列之二:https的SSL证书在服务器端的部署,基于tomcat,spring boot

Https系列之二:https的SSL证书在服务器端的部署,基于tomcat,spring boot