将 SSL 与 Redis 和 Spring Data Redis 结合使用时“无法获取 Jedis 连接”

Rag*_*kar 7 ssl spring redis

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

(请注意,如果我使用普通 Jedis 或带有 Spring 的 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;
    }

}
Run Code Online (Sandbox Code Playgroud)

Redis模板用法:

    @Autowired
    private RedisTemplate<String, String> redistemplate;


    public void api2() {

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

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

}
Run Code Online (Sandbox Code Playgroud)

使用 RedisTemplate 的任何操作都会引发以下异常:

“嵌套异常是 org.springframework.data.redis.RedisConnectionFailureException:无法获取 Jedis 连接;嵌套异常是 redis.clients.jedis.exceptions.JedisConnectionException:无法从池中获取资源] 根本原因 2018-01-22T15: 59:35.531+11:00 [APP/PROC/WEB/0] [OUT] java.net.SocketException: 连接重置 2018-01-22T15:59:35.531+11:00 [APP/PROC/WEB/0] [ OUT] 在 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]在 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] 在 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] 在 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] 在 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] 在 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] 在 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] 在 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] 在 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] 在 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] 在 redis.clients.jedis.JedisFactory.makeObject(JedisFactory) .java:108) ~[jedis-2.9.0.jar!/:na]"

笔记:

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

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

任何帮助或指示表示赞赏。

mp9*_*1de 0

不要使用JedisShardInfo,因为它会导致其携带的配置含糊不清。JedisShardInfoSpring Data Redis 2.0 中已弃用构造函数接受。请改用基于属性的配置:

JedisConnectionFactory conn =  new JedisConnectionFactory();
conn.setHostName(redisHost);
conn.setPort(redisPort);
conn.setUseSsl(true);
Run Code Online (Sandbox Code Playgroud)