Spring Boot 3 不支持通过 application.yml 或 properties 配置 Redis SSL 证书,因 RedisProperties 不解析 keystore 等字段;必须用 Java Config 显式构建 SslOptions 并注入 LettuceConnectionFactory,否则 TLS 握手失败。

Spring Boot 3 默认不支持通过 application.yml 或 application.properties 配置 Redis 的 SSL 证书路径和密码——哪怕你写了 spring.redis.ssl.keystore,它也会被完全忽略,连接必然失败。
为什么 spring.redis.ssl.enabled=true 不够用
这个配置只告诉 Lettuce “走 TLS 协议”,但不提供任何证书材料。JVM 无法完成 SSL 握手,启动时看似成功,实际首次执行命令就会抛出 javax.net.ssl.SSLHandshakeException,典型报错包括:
-
No name matching redis.example.com found(主机名验证失败) -
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException(信任链不可信)
根本原因是:Spring Boot 的 RedisProperties 类压根不解析 keystore、truststore、key-password 等字段,它们不属于 Spring Boot 官方映射的配置项。
必须用 Java Config 构造 SslOptions 并注入 LettuceConnectionFactory
这是唯一可靠的方式。Lettuce 6.3+(Spring Boot 3 默认)要求显式构建 SslOptions,再传给 LettuceConnectionFactory。关键点:
-
keystore和truststore必须是java.io.File实例,不能用 classpath 路径字符串(如classpath:redis-keystore.jks) - 密码不能硬编码在代码里,应从环境变量或
@ConfigurationProperties注入 - 端口必须匹配 Redis 服务端开启 TLS 的端口(常见为
6380,不是默认的6379) - 若服务端启用 SNI 或自定义主机名验证,需额外调用
.hostnameVerifier(...)
最小可行示例(JDK 17+,Spring Boot 3.3+):
@Bean
public RedisConnectionFactory redisConnectionFactory() {
RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
config.setHostName("redis.example.com");
config.setPort(6380);
config.setPassword(RedisPassword.of(System.getenv("REDIS_PASSWORD")));
SslOptions sslOptions = SslOptions.builder()
.keystore(new File("/etc/ssl/redis-keystore.jks"))
.keystorePassword(System.getenv("KEYSTORE_PASSWORD"))
.truststore(new File("/etc/ssl/redis-truststore.jks"))
.truststorePassword(System.getenv("TRUSTSTORE_PASSWORD"))
.build();
LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder()
.useSsl(sslOptions)
.commandTimeout(Duration.ofSeconds(3))
.build();
return new LettuceConnectionFactory(config, clientConfig);
}
常见踩坑点:文件路径、权限与 JVM 参数
即使代码写对,仍可能因环境问题失败:
-
FileNotFoundException:路径写错,或应用运行用户(如springboot用户)无权读取.jks文件(Linux 下注意chmod 400+chown) - 证书过期或域名不匹配:用
keytool -printcert -file redis.crt检查有效期和Subject CN=是否匹配连接地址 - JVM 默认不信任自签名 CA:如果
redis-truststore.jks是自建 CA 签发的,必须确保它包含该 CA 的根证书;否则要加 JVM 参数-Djavax.net.ssl.trustStore=...(不推荐,会污染全局 SSL 上下文) - Lettuce 连接池未启用 SSL:忘记在
LettuceClientConfiguration.builder()中调用.useSsl(...),会导致连接复用时走明文通道
最易被忽略的是:SSL 配置和连接池配置是两个独立环节,SslOptions 必须通过 LettuceClientConfiguration 显式绑定,而不是塞进 RedisStandaloneConfiguration ——后者只管地址密码,不管加密。


















