Spring Boot连接开启SSL的AWS Elastic Cache集群时出现异常
解决Spring Boot 1.5.9连接带SSL和认证的AWS ElastiCache Redis集群问题
我之前碰到过几乎一模一样的情况,Spring Boot 1.5.x版本的spring-boot-starter-data-redis依赖的Jedis版本(大概是2.9.x)在处理Redis集群的SSL+密码认证组合时存在兼容性问题——旧版Jedis在集群模式下初始化连接时,没有正确把SSL配置和认证信息传递给所有节点,导致握手阶段直接出现连接重置。
下面是我亲测有效的解决步骤:
1. 先尝试升级Jedis版本(小版本升级,避免兼容问题)
Spring Boot 1.5.9默认绑定的Jedis是2.9.x系列,你可以尝试升级到同系列的最新稳定版(比如2.9.3,这个版本修复了不少SSL相关的集群连接bug),在pom.xml中覆盖依赖:
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.3</version> </dependency>
注意不要跨大版本升级,不然容易和Spring Boot 1.5.x的API出现不兼容。
2. 自定义Redis连接工厂(核心解决方案)
如果升级Jedis后还是不行,就需要手动创建连接工厂,确保每个集群节点的连接都同时启用SSL和携带认证信息:
import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisClusterConfiguration; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; import redis.clients.jedis.JedisPoolConfig; import redis.clients.jedis.JedisShardInfo; import java.util.List; @Configuration public class RedisClusterConfig { @Value("${spring.redis.cluster.nodes}") private List<String> clusterNodes; @Value("${spring.redis.password}") private String redisPassword; @Value("${spring.redis.ssl:true}") private boolean sslEnabled; @Bean public RedisClusterConfiguration redisClusterConfiguration() { RedisClusterConfiguration config = new RedisClusterConfiguration(clusterNodes); config.setPassword(redisPassword); return config; } @Bean public JedisConnectionFactory jedisConnectionFactory(RedisClusterConfiguration config) { // 配置连接池参数,可根据业务调整 JedisPoolConfig poolConfig = new JedisPoolConfig(); poolConfig.setMaxTotal(100); poolConfig.setMaxIdle(20); poolConfig.setMinIdle(5); JedisConnectionFactory factory = new JedisConnectionFactory(config, poolConfig); factory.setUseSsl(sslEnabled); // 关键:手动为每个集群节点创建带SSL和密码的连接信息 factory.setShardInfoProvider(node -> { JedisShardInfo shardInfo = new JedisShardInfo(node.getHost(), node.getPort()); shardInfo.setPassword(redisPassword); shardInfo.setSsl(sslEnabled); return shardInfo; }); return factory; } }
这段代码的核心是通过setShardInfoProvider绕过旧版Jedis的配置传递bug,确保每个节点的连接都正确应用SSL和认证规则。
3. 验证AWS ElastiCache的配置
最后再确认一下你的ElastiCache集群配置:
- 数据传输加密(in-transit encryption)已启用,且客户端连接端口是6379(加密集群默认还是用6379,不需要改端口)
- 认证密码和你配置的
spring.redis.password完全一致 - 安全组已经允许你的应用服务器访问ElastiCache集群的6379端口
如果还是有问题,可以开启Jedis的调试日志排查细节:
logging.level.redis.clients.jedis=DEBUG
通过日志能看到每个节点的连接建立过程,定位具体是哪个环节出了问题。
内容的提问来源于stack exchange,提问作者Ram
相关产品推荐
相关产品推荐

