如何解决Spring Boot 3.x中Redis连接出现的SSL握手失败_配置SSL证书及禁用主机校验

梦明酱_6260

梦明酱_6260

2026-06-09

376人浏览

原创

根本原因是lettuce未显式调用usessl()启用ssl握手,且ssl连接需强制指定protocolversion.resp2并配置正确truststore与hostnameverifier;spring.redis.ssl=true不会自动触发ssl启用。

如何解决spring boot 3.x中redis连接出现的ssl握手失败_配置ssl证书及禁用主机校验

Spring Boot 3.x 连接 Redis 启用 SSL 后出现 SSLHandshakeException: General SSLEngine problem,根本原因几乎总是证书信任链未就位或主机名验证失败——不是配错端口,也不是密码错误。

Redis SSL 连接必须显式启用 useSsl(),否则走明文协议

哪怕你配置了 spring.redis.ssl=true、用了 rediss:// 协议、甚至把证书放对了位置,LettuceConnectionFactory 默认仍不启用 SSL 握手。Lettuce 的连接构建器必须手动调用 useSsl() 才会加载 SslConnectionProvider

  • Spring Boot 3.x 的 spring-boot-starter-data-redis 不会自动为你调用 useSsl(),哪怕 spring.redis.ssl=true 已设
  • 必须通过 LettuceClientConfigurationBuilderCustomizer 注入自定义逻辑
  • 错误写法:clientOptions.builder().build() —— 缺少 .useSsl(),等同于没开 SSL
  • 正确写法:clientOptions.builder().useSsl().build()

禁用主机名验证需绕过 Lettuce 默认的 DefaultHostnameVerifier

Lettuce 在 SSL 握手后默认校验服务端证书的 Subject Alternative Name (SAN)CN 是否匹配你连接的 host。自签名证书或内网域名(如 redis-cluster.internal)必然失败,报错类似 java.security.cert.CertificateException: No subject alternative names matching IP address 10.0.2.15 found

Redis Skill - 高性能缓存管理
Redis Skill - 高性能缓存管理

Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。

下载
  • 不能靠配置项关闭,必须代码级替换 HostnameVerifier
  • 使用 new NoopHostnameVerifier()(注意是 Apache HttpComponents 的,不是 JDK 自带的)
  • 需搭配 sslOptions() 显式传入自定义 SSLSocketFactoryHostnameVerifier
  • 若混用 Bouncy Castle 或旧版 javax.net.ssl 类,可能触发 ClassCastException

证书格式与 TrustStore 必须匹配 JDK 17+ 默认策略

Spring Boot 3.x 基于 JDK 17+,其 trustStore 默认只信任 CA 签发证书,且拒绝 TLSv1.1 及以下协议、弱密钥交换算法。自签名证书必须导入到 JVM truststore,不能只靠配置 spring.redis.ssl.trust-store(该配置仅对部分老客户端有效,Lettuce 忽略它)。

  • 别再用 keytool -import -file ca.crt -keystore $JAVA_HOME/jre/lib/security/cacerts —— JDK 17+ 的 cacerts 路径已变,且修改系统 truststore 风险高
  • 推荐做法:生成独立 truststore.jks,用 keytool -importcert 导入你的 CA 或自签证书,再在启动时加 JVM 参数:-Djavax.net.ssl.trustStore=/path/to/truststore.jks -Djavax.net.ssl.trustStorePassword=changeit
  • 务必确认 enabled-protocols 包含 TLSv1.2TLSv1.3,JDK 17+ 默认禁用 TLSv1
  • spring.redis.ssl.trust-store-type 设为 JKSPKCS12 均可,但类型必须与你生成的文件一致

Lettuce 6.4.x 存在 RESP3 协议握手缺陷,强制降级到 RESP2 是刚需

Spring Boot 3.4 默认拉取 Lettuce 6.4.1,该版本在启用 SSL 时与 Redis 7.x 的 HELLO 命令协商失败,表现为连接卡住、超时或抛出 Cannot decode command,底层实际是 SSL 握手成功但协议协商崩溃。

  • 不升级 Lettuce 到 6.5+ 的前提下,必须显式指定 ProtocolVersion.RESP2
  • 配置方式:在 LettuceClientConfigurationBuilderCustomizer 中设置 clientOptions.builder().protocolVersion(ProtocolVersion.RESP2).useSsl()...
  • 若跳过这步,即使证书、端口、密码全对,也会在连接池初始化阶段静默失败
  • 验证是否生效:debug 时检查 LettuceConnectionFactory.getClusterClientOptions().getClientOptions().getProtocolVersion() 是否为 RESP2

真正容易被忽略的是:SSL 握手失败时,Lettuce 日志默认不打印详细 TLS 握手过程(除非开启 io.lettuce.core.protocol DEBUG 级别),你看到的 SSLHandshakeException 往往只是表象;背后可能是证书过期、OCSP 响应超时、SNI 扩展缺失、甚至国产信创环境下的国密套件不兼容——这些都需要从 JVM 层抓包或启用 -Djavax.net.debug=ssl:handshake 才能定位。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2025.08.06

2091

22

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

2026.01.26

377

25

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

3989

19

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.14

3475

11

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

6152

6

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

583

6

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

696

6

mysql和redis怎么保证双写一致性
mysql和redis怎么保证双写一致性

确保 mysql 和 redis 双写一致性的技术包括:1、事务性更新:同时更新 mysql 和 redis,保证一致性;2、主从复制:mysql 主服务器更改同步到 redis 从服务器;3、基于事件的更新:mysql 记录更改并发送到 redis等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

5522

6

redis缓存一般存些什么数据
redis缓存一般存些什么数据

redis缓存中存储的数据类型包括:字符串、哈希、列表、集合、有序集合、位图、地理空间数据和hyperloglog。这些数据类型适用于存储各种数据,从简单信息到复杂对象和地理位置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1120

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Spring Boot 官方快速入门指南
Spring Boot 官方快速入门指南

共0课时 | 0人学习

Spring Boot 官方参考文档
Spring Boot 官方参考文档

共0课时 | 0人学习

尚硅谷新版SpringBoot3教程
尚硅谷新版SpringBoot3教程

共0课时 | 0人学习