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.properties或application.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协议并处理双向认证等高级场景。