spring.redis.ssl.enable=true是开启Redis SSL的唯一有效开关,需配合trust-store/key-store路径及密码等参数使用,且证书路径必须用classpath:或file:显式声明,集群模式下还需调大max-redirects并选用Lettuce驱动。

spring.redis.ssl.enable 是开启 Redis SSL 的唯一开关
Spring Boot 2.4+ 版本起,spring.redis.ssl=true 已被弃用,必须改用 spring.redis.ssl.enable=true。如果只写 spring.redis.ssl=true,应用启动时不会报错,但实际连接仍走明文,Redis 日志里会出现 Client sent AUTH, but no password is set 类似提示(尤其在集群模式下),本质是 SSL 握手失败后降级重试导致的混淆。
这个配置项必须配合其他 SSL 参数一起生效,单独设为 true 会导致连接超时或 javax.net.ssl.SSLHandshakeException。
spring.redis.ssl.enable=true—— 必须显式启用spring.redis.ssl.trust-store或spring.redis.ssl.key-store至少提供其一(单向认证只需 trust-store)spring.redis.ssl.trust-store-password和spring.redis.ssl.key-store-password按需填写,空密码也要显式写""
证书路径必须用 classpath: 或 file: 显式声明
Spring Boot 不会自动推断证书位置。spring.redis.ssl.trust-store=redis-truststore.jks 这种写法无效,会被当成相对路径尝试加载,最终抛出 java.io.FileNotFoundException。
正确写法只有两种:
- 证书放在
src/main/resources下:用classpath:redis-truststore.jks - 证书放在 jar 外部(推荐生产环境):用
file:/etc/ssl/redis/redis-truststore.jks
注意:file: 路径必须是绝对路径;classpath: 后不能带斜杠开头,比如 classpath:/redis.jks 会失败。
Redis 集群 + SSL 需额外设置 max-redirects
开启 SSL 后,Jedis 或 Lettuce 在重定向时容易卡住,默认 spring.redis.cluster.max-redirects=1 不够用,尤其当集群节点分布在不同网络区域时,SSL 握手耗时增加,重试窗口变窄。
建议值设为 3 或 5,并确认客户端使用的驱动支持 SSL 重定向:
- Jedis 3.8+ 支持集群 SSL,但不支持自动重定向证书验证(需自定义
JedisCluster构造参数) - Lettuce 是更稳妥的选择,
spring-boot-starter-data-redis默认就是它,且对 SSL 集群重定向兼容更好 - 务必检查依赖中没有混入旧版
jedis,否则可能触发ClassCastException: SslConnectionProvider cannot be cast to ConnectionProvider
SSL 握手失败时最常被忽略的三个点
错误日志里出现 PKIX path building failed 或 unable to find valid certification path to requested target,90% 是以下原因:
- 证书链不完整:CA 根证书没导入到 trust-store,只放了 server.crt —— 要用
keytool -importcert -file ca.crt -keystore redis-truststore.jks补全 - 主机名验证失败:Redis 节点域名和证书
Subject Alternative Name (SAN)不匹配 —— 开发环境可临时加spring.redis.ssl.verify-mode=none(仅限测试) - JDK 版本太低:JDK 8u291 之前默认禁用 TLSv1.3,而某些云 Redis 服务强制要求 TLSv1.3 —— 升级 JDK 或在 JVM 启动参数加
-Djdk.tls.client.protocols=TLSv1.2,TLSv1.3
真正上线前,别只测通不通,要抓包确认 TCP 流里确实有 Change Cipher Spec 和加密载荷 —— 否则很可能只是“看起来连上了”,实则走的还是裸连。