spring - 将 SSL 与 Redis 和 Spring Data Redis 一起使用时为 "Cannot get Jedis connection"

标签 spring ssl redis

我正在使用支持 SSL 的 Redis(来自 AWS 的 ElasticCache),并且在使用 Spring Data Redis 连接到它时遇到困难。

(请注意,如果我使用带有 Spring 的普通 Jedis 或 Jedis Pool,连接工作正常)。

以下是代码片段:

    @Value("${vcap.services.myredis.credentials.host}")
    private String redisHost;

    @Value("${vcap.services.myredis.credentials.password}")
    private String redisPassword;

    @Value("${vcap.services.myredis.credentials.port}")
    private String redisPort;

    public RedisTemplate<String, Object> redisTemplate() {

        final RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();


        String hostUri = "rediss://:" + redisPassword + "@" + redisHost + redisPort;    

        JedisShardInfo info = new JedisShardInfo(hostUri);

        JedisConnectionFactory conn =  new JedisConnectionFactory(info);

        conn.afterPropertiesSet();

        template.setConnectionFactory(conn);
        template.setValueSerializer(new GenericToStringSerializer<Object>(Object.class));
        return template;
    }

}

RedisTemplate 用法:

    @Autowired
    private RedisTemplate<String, String> redistemplate;


    public void api2() {

        HashOperations<String, Object, Object> hashOperations = redistemplate.opsForHash();

        hashOperations.put("KEY", "1", "one"); 
    }

}

任何使用 RedisTemplate 的操作都会抛出以下异常:

"nested exception is org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool] with root cause 2018-01-22T15:59:35.531+11:00 [APP/PROC/WEB/0] [OUT] java.net.SocketException: Connection reset 2018-01-22T15:59:35.531+11:00 [APP/PROC/WEB/0] [OUT] at java.net.SocketInputStream.read(SocketInputStream.java:210) ~[na:1.8.0_141] 2018-01-22T15:59:35.531+11:00 [APP/PROC/WEB/0] [OUT] at java.net.SocketInputStream.read(SocketInputStream.java:141) ~[na:1.8.0_141] 2018-01-22T15:59:35.531+11:00 [APP/PROC/WEB/0] [OUT] at java.net.SocketInputStream.read(SocketInputStream.java:127) ~[na:1.8.0_141] 2018-01-22T15:59:35.531+11:00 [APP/PROC/WEB/0] [OUT] at redis.clients.util.RedisInputStream.ensureFill(RedisInputStream.java:196) ~[jedis-2.9.0.jar!/:na] 2018-01-22T15:59:35.531+11:00 [APP/PROC/WEB/0] [OUT] at redis.clients.util.RedisInputStream.readByte(RedisInputStream.java:40) ~[jedis-2.9.0.jar!/:na] 2018-01-22T15:59:35.531+11:00 [APP/PROC/WEB/0] [OUT] at redis.clients.jedis.Protocol.process(Protocol.java:151) ~[jedis-2.9.0.jar!/:na] 2018-01-22T15:59:35.531+11:00 [APP/PROC/WEB/0] [OUT] at redis.clients.jedis.Protocol.read(Protocol.java:215) ~[jedis-2.9.0.jar!/:na] 2018-01-22T15:59:35.531+11:00 [APP/PROC/WEB/0] [OUT] at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:340) ~[jedis-2.9.0.jar!/:na] 2018-01-22T15:59:35.531+11:00 [APP/PROC/WEB/0] [OUT] at redis.clients.jedis.Connection.getStatusCodeReply(Connection.java:239) ~[jedis-2.9.0.jar!/:na] 2018-01-22T15:59:35.531+11:00 [APP/PROC/WEB/0] [OUT] at redis.clients.jedis.BinaryJedis.auth(BinaryJedis.java:2139) ~[jedis-2.9.0.jar!/:na] 2018-01-22T15:59:35.531+11:00 [APP/PROC/WEB/0] [OUT] at redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:108) ~[jedis-2.9.0.jar!/:na]"

注意:

  1. 这不是 SSL 证书的问题,因为 AWS 的 SSL 证书已经存在于 JVM Trust 存储中,请注意 JedisPool 正在使用 SSL。

  2. 我怀疑 JedisConnectionFactory 以某种方式忽略了 SSL 连接,并且没有进行连接。我尝试了 JedisConnectionFactory 的其他 arg 构造函数,例如将 useSSL 设置为 true 等,但没有成功。

感谢任何帮助或指点。

最佳答案

不要使用 JedisShardInfo,因为它会导致其携带的配置出现歧义。接受 JedisShardInfo 的构造函数在 Spring Data Redis 2.0 中已弃用。改用基于属性的配置:

JedisConnectionFactory conn =  new JedisConnectionFactory();
conn.setHostName(redisHost);
conn.setPort(redisPort);
conn.setUseSsl(true);

关于spring - 将 SSL 与 Redis 和 Spring Data Redis 一起使用时为 "Cannot get Jedis connection",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48493941/

相关文章:

redis - redis sentinel故障转移后返回旧主人

java - 使用@SpringBootTest时如何在测试类中 Autowiring bean

c# - 如何调用启用 SSL 的 Web Api?

security - 是否可以拦截纯文本安全请求的有效负载?

ssl - OpenSSL 连接 : alert internal error

c# - Xamarin 试图从 web 服务中获取用户,立即崩溃

java - Spring MVC 中的多 DispatcherServlet (Java 配置)

java - Spring Boot 独立应用程序在生产中部署

java - Spring oauth拦截rest api调用并从一个拦截器转发

Redis Stream - 事件的顺序保证