Spring Boot如何强制指定特定TLS版本与密码套件?
我正在搭建一个Spring Boot SOAP Web服务,根据规范要求需通过TLS保障安全,且规范明确了应使用的TLS版本与密码套件。为满足规范要求,我对application.yaml进行了如下配置:
server: ssl: enabled: true ciphers: [ TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 ] protocol: TLS enabled-protocols: TLSv1.2 bundle: "web-server" client-auth: none port: 443
我通过curl测试确认客户端可访问该服务且通信已加密,但实际使用的TLS版本与密码套件并未匹配服务器配置:
SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
看起来客户端与服务器协商采用了最安全的配置,导致application.yaml中的设置被完全忽略。请问是否有办法强制服务器使用特定的TLS版本/密码套件?
你的配置不生效的核心原因是**ssl.bundle 属性会覆盖 server.ssl 下的大部分手动配置**。当指定了SSL bundle(比如这里的web-server),Spring Boot会优先使用bundle中定义的SSL参数,包括协议版本和密码套件,从而忽略你手动设置的enabled-protocols和ciphers。
要强制使用指定的TLS版本和密码套件,可以按以下步骤操作:
1. 移除或禁用SSL Bundle
如果不需要使用预定义的SSL bundle,直接删除server.ssl.bundle: "web-server"这一行。这样Spring Boot就会读取你手动配置的enabled-protocols和ciphers参数。
修改后的application.yaml:
server: ssl: enabled: true ciphers: [ TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 ] protocol: TLS enabled-protocols: TLSv1.2 client-auth: none port: 443
2. 自定义Tomcat Connector(如果仍需使用SSL Bundle或配置不生效)
如果必须保留SSL Bundle,或者修改配置后依然不生效,可以通过自定义Tomcat连接器来强制设置TLS参数。Spring Boot默认使用Tomcat作为嵌入式服务器,你可以通过TomcatConnectorCustomizer来精确控制SSL配置:
创建一个配置类:
import org.apache.catalina.connector.Connector; import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer; import org.springframework.boot.web.servlet.server.ServletWebServerFactory; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class TomcatSslConfig { @Bean public ServletWebServerFactory servletWebServerFactory() { TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(); factory.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> { // 强制启用指定的TLS版本 connector.setAttribute("sslEnabledProtocols", "TLSv1.2"); // 强制设置指定的密码套件 connector.setAttribute("ciphers", "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"); }); return factory; } }
这个配置会直接修改Tomcat连接器的SSL参数,优先级高于application.yaml中的配置,确保服务器只使用你指定的TLS版本和密码套件。
3. 验证配置是否生效
修改完成后,重启服务,再次用curl测试:
curl -v https://your-service-url
查看输出中的SSL连接信息,确认是否使用了TLSv1.2和你指定的密码套件。
另外,也可以使用openssl s_client工具更详细地验证:
openssl s_client -connect your-service-host:443 -tls1_2
如果服务器只允许TLSv1.2,使用-tls1_3参数连接会失败,这说明配置生效。
内容的提问来源于stack exchange,提问作者Julien Berthoud

