2

我有一个带有 RLEC(RedisLabs 企业集群)UI 的 Redis 数据库,该 UI 已为 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 以免出现此错误。

4

1 回答 1

0

已编辑。

回顾一下,我可以使用 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。

我也收到了关于流意外结束的异常。

我不得不打开usePoolingJedisClientConfiguration

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

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

于 2020-06-11T20:50:47.677 回答