1. 引言

本文将探讨SSL在安全通信中的重要性,以及Spring框架的统一SSL支持如何简化Spring Boot、Spring Security和Spring Web等模块的配置。

SSL(安全套接层)是建立Web服务器与浏览器之间加密链接的标准安全协议,确保传输数据的私密性和安全性。对于保护敏感信息和构建Web应用信任至关重要。

2. 统一SSL支持的新特性

Spring Boot 3.1引入了SslBundle组件,作为定义和管理SSL配置的集中式方案。SslBundle将密钥库、信任库、证书和私钥等SSL相关设置整合为可复用的配置包,轻松应用于各种Spring组件。

核心亮点包括:

  • 集中配置:SSL属性现在统一在spring.ssl.bundle前缀下管理,提供单一配置源
  • 简化管理:框架提供清晰默认值、改进文档,并支持双向SSL认证等复杂场景
  • 增强安全实践:开箱即用确保符合现代安全标准,支持JKS、PKCS12和PEM证书,简化HTTPS强制配置
  • 动态重载:密钥材料变更时SSL包可自动重载,更新过程零停机

统一SSL支持兼容Tomcat、Netty等Web服务器、REST客户端及数据访问技术,确保整个Spring生态一致的SSL体验。

3. 在Spring Boot中配置SSL

Spring Boot的SSL配置简单直接,且支持统一配置方案。

3.1 通过属性启用SSL

application.propertiesapplication.yml中配置:

server:
  ssl:
    enabled: true
    key-store: classpath:keystore.p12
    key-store-password: password
    key-store-type: PKCS12

这会启用SSL并指定包含SSL证书的密钥库位置、密码和类型。

3.2 配置密钥库和信任库

配置包含服务器证书和私钥的密钥库:

spring:
  ssl:
    bundle:
      jks:
        mybundle:
          keystore:
            location: classpath:application.p12
            password: secret
            type: PKCS12

配置包含受信任服务器证书的信任库:

spring:
  ssl:
    bundle:
      jks:
        mybundle:
          truststore:
            location: classpath:application.p12
            password: secret

3.3 设置自签名和CA签名证书

自签名证书适用于测试或内部环境,使用keytool生成:

$ keytool -genkeypair -alias myalias -keyalg RSA -keystore keystore.p12 -storetype PKCS12 -storepass password

⚠️ 生产环境强烈建议使用CA签名证书,从证书颁发机构(CA)获取后添加到密钥库或信任库。

4. Spring Security与SSL集成

Spring Security与统一SSL支持无缝集成,确保安全通信和认证。

开发者可通过SslBundles建立客户端和服务端的安全连接,并强制应用使用HTTPS。以下配置强制HTTPS:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.requiresChannel()
          .anyRequest()
          .requiresSecure();
    }
}

为增强安全性,启用HTTP严格传输安全(HSTS):

http.headers()
  .httpStrictTransportSecurity()
  .includeSubDomains(true)
  .maxAgeInSeconds(31536000); // 1年

此策略确保浏览器仅通过HTTPS与应用通信

5. 自定义SSL配置

精细调整SSL设置可增强安全性、优化性能并满足特殊需求。

5.1 调整SSL协议和加密套件

自定义支持的SSL协议和加密套件:

server:
  ssl:
    enabled-protocols: TLSv1.3,TLSv1.2
    ciphers: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

5.2 编程式配置高级场景

复杂场景可通过编程方式配置:

HttpServer server = HttpServer.create()
  .secure(sslContextSpec -> sslContextSpec.sslContext(sslContext));

此方法提供对SSL设置的细粒度控制,特别适合动态环境。

5.3 处理特殊场景

统一SSL支持可处理双向SSL认证等特殊场景:

server:
  ssl:
    client-auth: need

此设置要求SSL握手时必须提供有效客户端证书

6. 结论

本文介绍了Spring Boot 3.1的统一SSL支持,它简化了Spring应用的SSL配置。新的SslBundle集中管理SSL设置,使开发者可在统一位置管理证书、密钥库和信任库。该特性简化安全通信,与Spring Security无缝集成,并帮助强制HTTPS。

配置过程用户友好,提供清晰的SSL启用选项、密钥库设置和安全特性定制。开发者可轻松调整SSL协议并处理双向认证等高级场景。


原始标题:Unified SSL Support in Spring Framework | Baeldung