Spring Boot与iOS Swift端TLS握手缓存30秒超时延长方案咨询
TLS会话复用30秒超时问题解决方案
Java端调整配置
你当前使用的是Undertow容器(日志中出现XNIO线程标识),Undertow默认的SSL会话超时、空闲连接超时均为30秒,这是触发问题的核心原因,按以下步骤调整即可:
- 新增Spring Boot自定义Undertow配置Bean,调整空闲连接和SSL会话相关参数:
import org.springframework.boot.web.embedded.undertow.UndertowWebServerFactoryCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import io.undertow.UndertowOptions; @Configuration public class UndertowConfig { @Bean public UndertowWebServerFactoryCustomizer undertowCustomizer() { return factory -> factory.addBuilderCustomizers(builder -> { // 空闲连接超时设为300秒(5分钟),单位为毫秒 builder.setServerOption(UndertowOptions.NO_REQUEST_TIMEOUT, 300000); // SSL会话超时设为3600秒(1小时),单位为秒 builder.setServerOption(UndertowOptions.SSL_SESSION_TIMEOUT, 3600); // SSL会话缓存大小调整为10万,适配用户量较大的场景 builder.setServerOption(UndertowOptions.SSL_SESSION_CACHE_SIZE, 100000); }); } }
- 在现有的启动类main方法中补充JVM TLS参数,优化会话票证生效规则:
// TLS会话票证有效期设为3600秒(1小时) System.setProperty("jdk.tls.server.sessionTicketTimeout", "3600"); // 服务端TLS会话缓存超时设为3600秒,和Undertow配置对齐 System.setProperty("jdk.tls.server.sessionTimeout", "3600"); // 服务端TLS会话缓存大小调整为100000 System.setProperty("jdk.tls.server.sessionCacheSize", "100000");
注意:如果是集群部署,需要统一配置所有节点的TLS会话票证加密密钥,避免跨节点请求无法复用会话。
Swift端调整配置
iOS的URLSession默认自带TLS会话缓存能力,按以下规则配置即可最大化复用效率:
- 全局复用同一个URLSession实例,不要每次请求都新建URLSession对象,TLS会话缓存和URLSession实例绑定,实例销毁后缓存会直接清空。
- 调整URLSessionConfiguration的超时配置,和服务端空闲超时对齐:
let config = URLSessionConfiguration.default // 请求超时设为30秒,可根据业务实际场景调整 config.timeoutIntervalForRequest = 30 // 资源整体超时设为300秒,和服务端空闲连接超时对齐 config.timeoutIntervalForResource = 300 // iOS13+可开启多路径支持,进一步优化弱网下的连接效率 if #available(iOS 13.0, *) { config.multipathServiceType = .handover } // 全局复用该session实例即可 let sharedSession = URLSession(configuration: config)
- 没有特殊安全要求的前提下,不要主动调用
URLCache.shared.removeAllCachedResponses()之类的缓存清理方法,也不要修改httpCookieStorage的默认配置,两类操作都会导致TLS会话缓存失效。
内容的提问来源于stack exchange,提问作者Sorin Penteleiciuc
相关产品推荐
相关产品推荐

