You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 20:02:05