如何将 JedisConnectionFactory 配置为使用 SSL,以免出现错误:“JedisDataException:ERR 未加密连接被禁止”?

Posted

技术标签:

【中文标题】如何将 JedisConnectionFactory 配置为使用 SSL,以免出现错误:“JedisDataException:ERR 未加密连接被禁止”?【英文标题】:How do I configure JedisConnectionFactory to use SSL so that I don't get the error: "JedisDataException: ERR unencrypted connection is prohibited"? 【发布时间】:2019-07-27 07:31:50 【问题描述】:

我有一个带有 RLEC(RedisLabs 企业集群)用户界面的 Redis 数据库,该用户界面已为 SSL 连接设置。

我有一个能够使用 Jedis 连接到 redis 数据库的 java 应用程序。

这行得通:

Jedis jedis = new Jedis(redisInfo.getHost(), redisInfo.getPort(), useSsl);

// make the connection
jedis.connect();

// authorize with our password
jedis.auth(redisInfo.getPassword());

环境变量:

"-Djavax.net.ssl.keyStoreType=PKCS12 -Djavax.net.ssl.keyStorePassword=iloveredis -Djavax.net.ssl.keyStore=$PWD/META-INF/clientKeyStore.p12 -Djavax.net.ssl.trustStoreType=JKS -Djavax.net.ssl.trustStorePassword=iloveredis -Djavax.net.ssl.trustStore=$PWD/META-INF/clientTrustStore.jks"

我还有一个 Spring Boot 应用程序,我正在尝试使用 JedisConnectionFactory 连接到 Redis 数据库,但我无法连接。 (使用同一个应用程序,我可以连接到没有启用 SSL 的 Redis 数据库)。

在我的 pom.xml 中:

          <dependency>
              <groupId>org.springframework.data</groupId>
              <artifactId>spring-data-redis</artifactId>
              <version>2.1.4.RELEASE</version>
          </dependency>

          <dependency>
                 <groupId>redis.clients</groupId>
                 <artifactId>jedis</artifactId>
                 <version>2.9.0</version>
          </dependency>

在我的redis配置文件中:

@Configuration
@EnableRedisRepositories
public class RedisConfig 

@Bean
JedisConnectionFactory jedisConnectionFactory() 
   RedisStandaloneConfiguration redisConfig = new RedisStandaloneConfiguration();
   redisConfig.setHostName(redisInfo.getHost());
   redisConfig.setPort(redisInfo.getPort());
   redisConfig.setPassword(RedisPassword.of(redisInfo.getPassword()));
   boolean useSsl = env.getProperty("spring.redis.ssl", Boolean.class);
   JedisClientConfiguration jedisConfig;
   if (useSsl) 
          jedisConfig = JedisClientConfiguration
                                                                              .builder()
                                                                              .useSsl()
                                                                              .build(); 
    else 
          jedisConfig = JedisClientConfiguration
                              .builder()
                              .build();                  
   
    JedisConnectionFactory jcf = new JedisConnectionFactory(redisConfig, jedisConfig); 

    return jcf;




@Bean
public RedisTemplate<?, ?> redisTemplateJedis() 
   final RedisTemplate<byte[], byte[]> template = new RedisTemplate<>();
   template.setConnectionFactory(jedisConnectionFactory());
    template.setValueSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));
    return template;

这是我得到的错误:

org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisDataException: ERR unencrypted connection is prohibited

另外一点是,出于测试目的,服务器和应用程序都使用自签名证书(可与 Jedis 一起使用)。

我不知道如何配置 JedisConfigurationFactory 以免出现此错误。

【问题讨论】:

你解决了这个问题吗 这有什么更新吗?我面临同样的问题,想在 ssl 上连接 redis。 【参考方案1】:

已编辑。

回顾一下,我可以使用 Jedis 库连接到启用 SSL 的 Redis,但不能使用 Spring 库 JedisConnectionFactory。

我在 Pivotal Cloud Foundry (PCF) 中尝试过这个。

我写信给 spring-data-redis 的作者 Mark Paluch,他建议我关闭自动重新配置以使其在 PCF 中工作。

我在关闭自动重新配置时发现了这个页面:

https://docs.cloudfoundry.org/buildpacks/java/configuring-service-connections/spring-service-bindings.html#manual

Cloud Foundry 会自动为你创建一个 RedisConnectionFactory bean,所以我的 JedisConnectionFactory 没有被使用。

我不得不关闭自动重新配置。或者更确切地说打开手动配置。

我的 JedisConnectionFactory bean(启用了 SSL)然后开始实例化(连同云服务连接器的 RedisConnectionFactory bean)。

我必须将 JedisConnectionFactory bean 设置为 Primary,因为现在有两个连接工厂 bean。

我还收到有关流意外结束的异常。

我必须打开usePoolingin JedisClientConfiguration

这是我在 jira 上发布的关于该问题的帖子(现已移至 github):

https://github.com/spring-projects/spring-data-redis/issues/1542

【讨论】:

你是如何使用这个模板创建 RedisCacheManager 的?当前构造函数是RedisCacheManager(RedisOperations redisOperations) 然后现在改为RedisCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration) @ash 我在设置usePooling 时遇到问题,我该怎么做?我正在使用 JedisConnectionFactor @Ikaro 销售:jedisConfig = JedisClientConfiguration .builder() .useSsl() .usePooling() .build(); JedisConnectionFactory jcf = new JedisConnectionFactory(redisConfig, jedisConfig); @Vasudev:我没用过RedisCacheManager

以上是关于如何将 JedisConnectionFactory 配置为使用 SSL,以免出现错误:“JedisDataException:ERR 未加密连接被禁止”?的主要内容,如果未能解决你的问题,请参考以下文章

如何将Ios文件上传到

Qt如何将文字变成图片?

如何将Bitmap保存为本地图片文件?

在MATLAB中如何将图导出

ASP如何将SQLSERVER数据导出到DBF(VF)

如何将CSV格式转换成JSON格式