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>
元素的属性sessionCacheSize
和sessionTimeout
,
当你使用嵌入式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文件流关闭