You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:52:50