Spring Boot 的 RedisProperties 类仅映射基础连接参数,不解析 keystore、truststore 等 TLS 字段;ssl.enabled=true 仅启用 TLS 协议,证书材料必须通过 Java Config 显式构建 SslOptions 并注入 LettuceConnectionFactory。

Spring Boot 默认不支持通过 application.properties 直接指定 TLS 密钥库路径和密码来启用 Redis 的 SSL 连接——Lettuce 客户端的 SSL 配置必须在 Java 代码中完成,spring.redis.* 下的配置项不解析 keystore、truststore 等 TLS 相关字段。
为什么 application.properties 里配不了 keystore
Spring Boot 的 RedisProperties 类只映射基础连接参数(如 host、port、password、ssl.enabled),它把 ssl.enabled=true 当作开关传给 Lettuce,但不会读取任何密钥库路径或密码。真正的 TLS 选项(SslOptions)需要手动构建并注入 LettuceConnectionFactory。
-
spring.redis.ssl.enabled=true只是让 Lettuce 尝试走 TLS 握手,不提供证书材料 = 连接直接失败(常见报错:javax.net.ssl.SSLHandshakeException: No name matching xxx found或PKIX path building failed) - 密钥库(
keystore.jks)、信任库(truststore.jks)、密码、密钥别名等,全部需在 Bean 初始化时显式设置 - 若强行在 properties 里加
spring.redis.ssl.keystore=...,Spring 会静默忽略——无报错,也不生效
LettuceConnectionFactory 中配置 keystore 的正确写法
必须用 Java Config 显式构造 SslOptions 并绑定到 LettuceConnectionFactory。以下是最小可行示例(JDK 17+,Lettuce 6.3+):
@Bean
public RedisConnectionFactory redisConnectionFactory() {
RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
config.setHostName("your-redis-host");
config.setPort(6380); // TLS 端口通常是 6380 或 6379(取决于服务端配置)
config.setPassword(RedisPassword.of("your-password"));
SslOptions sslOptions = SslOptions.builder()
.keystore(new File("src/main/resources/redis-keystore.jks"))
.keystorePassword("keystore-pass-123")
.truststore(new File("src/main/resources/redis-truststore.jks"))
.truststorePassword("truststore-pass-456")
.build();
ClientOptions clientOptions = ClientOptions.builder()
.sslOptions(sslOptions)
.build();
LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder()
.clientOptions(clientOptions)
.useSsl() // 必须显式调用,否则 sslOptions 不生效
.build();
return new LettuceConnectionFactory(config, clientConfig);
}
- 路径必须是
File实例,不能用 classpath 资源(getResourceAsStream)——Lettuce 内部依赖KeyStore.load(InputStream, char[]),但要求文件可定位 -
.useSsl()是关键调用,漏掉会导致 TLS 被忽略(即使sslOptions已设) - 若 Redis 服务端使用自签名证书,必须提供
truststore;若用公共 CA 签发,可省略truststore,但建议仍显式配置以明确信任边界
application.properties 里只能配什么
你能在 application.properties 中安全使用的 Redis TLS 相关配置只有以下三项:
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
-
spring.redis.host=your-redis-host—— 必填,服务端地址 -
spring.redis.port=6380—— 必填,TLS 端口(非默认 6379) -
spring.redis.ssl.enabled=true—— 必填,告诉 Spring 启用 SSL 模式(仅影响底层连接工厂的协议选择,不提供证书)
其他如 spring.redis.ssl.trust-store、spring.redis.ssl.key-store-password 等字段不存在于 Spring Boot 官方属性列表中,添加后既不报错也不起作用。
容易踩的坑:证书路径与权限
生产环境部署时,File(".../redis-keystore.jks") 很容易因路径错误或权限不足失败:
- Jar 包内资源无法用
File加载——打包成 fat jar 后,src/main/resources下的 jks 文件实际在 jar 包内,new File("...")找不到物理路径。解决办法:把 keystore 放在外部目录(如/etc/myapp/redis-keystore.jks),并通过系统属性或环境变量传入路径 - Linux 容器中运行时,JVM 进程用户可能无权读取 keystore 文件——确保
chmod 600且属主匹配 - Keystore 密码含特殊字符(如
$、{)时,若从环境变量注入,需在 shell 中正确转义,否则 Spring 解析失败
真正要让 TLS 连上,关键不在配置文件写了多少行,而在 Java Bean 里是否把 SslOptions 构造完整、是否调用了 useSsl()、以及文件路径在目标环境中是否真实可达且可读。

















