Spring Boot和Spring Cloud应用实现SSL证书热更新
SSL 证书热更新技术方案
一、背景
SSL 证书热更新功能允许在不重启应用的情况下动态替换证书,适用于需要高可用性、零宕机的场景(如证书续期、证书轮换)。以下方案根据 Spring Boot 版本分为两类:
- 2023 年及以后:使用 Spring Boot 3.2.0+ 原生支持的 SSL 热重载功能。
- 2022 年及以前:通过第三方库或自定义
X509TrustManager实现热更新。
二、方案一:Spring Boot 3.2.0+ 原生支持(2023 及以后)
1. 核心特性
- 支持服务器:Tomcat、Netty 等嵌入式 Web 服务器。
- 热重载范围:证书(
.crt)和私钥(.key)文件变更时自动触发重载。 - 无需代码改动:仅需配置文件调整。
2. 实现步骤
1. 生成证书
openssl req -x509 -subj "/CN=demo-cert" -keyout demo.key -out demo.crt -sha256 -days 365 -nodes -newkey ed25519
2. 配置文件(application.yml)
spring:
ssl:
bundle:
pem:
demo:
reload-on-update: true # 启用热重载
keystore:
certificate: "certs/demo.crt"
private-key: "certs/demo.key"
server:
ssl:
bundle: "demo" # 指定使用的 SSL Bundle
port: 8443
3. 自动监控与重载
- Spring Boot 后台线程监控证书文件变化,触发 SSL 上下文更新。
- 日志确认:文件变更后,日志中会输出类似
Connector [https-jsse-nio-8443], ... configured from keystore,表示重载成功。
4. 验证
curl --insecure --verbose https://localhost:8443/
# 观察响应中的 `subject: CN=demo-cert` 是否更新。
3. 注意事项
- 文件权限:确保应用有读取证书文件的权限。
- 兼容性:仅支持 PEM 格式证书(
.crt和.key)。 - 旧连接处理:已建立的连接仍使用旧证书,新连接使用新证书。
三、方案二:自定义 X509TrustManager(2022 及以前)
1. 核心特性
- 支持场景:双向认证、动态证书来源(文件/数据库/缓存)。
- 灵活性:可自定义证书验证逻辑(如白名单、动态加载)。
- 依赖:需引入第三方库(如
hotssl-spring-boot-starter)。
2. 实现步骤
1. 添加依赖
<dependency>
<groupId>cn.mzhong</groupId>
<artifactId>hotssl-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
2. 配置文件(application.yml)
server:
ssl:
key-store: classpath:k-server.p12
key-store-password: jzsy123456
client-auth: need # 启用双向认证
trust-store: classpath:t-server.p12
trust-store-password: jzsy123456
3. 自定义 TrustManager
public class HotSslX509TrustManager implements X509TrustManager {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) {
// 动态加载信任库(如从文件/数据库)
KeyStore trustStore = KeyStoreLoader.load(trustStorePath, password, type);
// 验证客户端证书是否在信任库中
if (trustStore.getCertificateAlias(chain[0]) == null) {
throw new CertificateException("客户端证书不受信任");
}
}
}
4. 注册 TrustManager
@Bean
public X509TrustManager x509TrustManager() {
return new HotSslX509TrustManager();
}
5. 动态更新证书
- 手动触发:通过 API 或文件监听器重新加载信任库。
- 示例:调用
KeyStoreLoader.reload()方法更新证书。
3. 注意事项
- 性能开销:频繁加载证书可能影响性能。
- 线程安全:需确保
X509TrustManager的线程安全。 - 兼容性:需自行处理证书格式(如 JKS、PKCS12)。
四、方案对比
| 特性 | Spring Boot 3.2+ 原生方案 | 自定义 X509TrustManager 方案 |
|---|---|---|
| 适用版本 | Spring Boot 3.2.0+ | Spring Boot 2.x/3.x(需适配) |
| 实现复杂度 | 低(仅配置) | 中(需编写自定义逻辑) |
| 双向认证支持 | 需结合其他配置 | 支持 |
| 证书来源 | 文件 | 文件、数据库、缓存等 |
| 维护成本 | 低(官方维护) | 高(需自行维护) |
五、推荐方案
- 新项目/已升级到 Spring Boot 3.2+:优先使用原生方案,简单高效。
- 旧项目/需双向认证:选择自定义
X509TrustManager方案。
六、扩展建议
- 监控:添加日志或 Metrics 监控证书更新事件。
- 自动化:结合 CI/CD 实现证书自动续期与替换。
- 安全:限制证书文件访问权限,避免私钥泄露。
参考文档

浙公网安备 33010602011771号