【问题标题】:Spring boot 2 tomcat ssl handshake cachingSpring Boot 2 tomcat ssl握手缓存
【发布时间】: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 

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

【问题讨论】:

    标签: spring spring-boot ssl nginx tomcat


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2019-09-10
      • 1970-01-01
      • 2016-02-13
      • 2017-01-01
      • 2021-09-17
      • 2019-07-01
      • 2012-01-16
      • 2013-04-19
      • 2018-12-06
      相关资源
      最近更新 更多