Как мне настроить JedisConnectionFactory на использование SSL, чтобы я не получал ошибку: «Исключение JedisDataException: ОШИБКА незашифрованного соединения запрещена»?

#spring-boot #redis #jedis #spring-data-redis #self-signed-certificate

#весенняя загрузка #redis #jedis #spring-data-redis #самозаверяющий сертификат

Вопрос:

У меня есть база данных Redis с RLEC (корпоративный кластер RedisLabs) Пользовательский интерфейс, который был настроен для SSL-соединений.

У меня есть Java-приложение, которое может подключаться к базе данных redis с помощью Jedis.

Это работает:

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

// make the connection
jedis.connect();

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

Env vars:

 "-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, в котором я пытаюсь подключиться к базе данных Redis с помощью JedisConnectionFactory, и я не могу. (Используя то же приложение, я могу подключиться к базе данных Redis, в которой не включен SSL).

В моем 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, чтобы я не получал эту ошибку.

Комментарии:

1. вы исправили эту проблему

2. Есть какие-либо обновления по этому поводу? Я сталкиваюсь с такой же проблемой и хочу подключить redis по ssl.

Ответ №1:

Отредактировано.

Подводя итог, я мог подключиться к Redis с включенным SSL в библиотеке Jedis, но не в библиотеке Spring JedisConnectionFactory.

Я пробовал это в Pivotal Cloud Foundry (PCF).

Я написал Марку Палуху, автору spring-data-redis, и он предложил мне отключить автоматическую перенастройку, чтобы заставить ее работать в PCF.

Я нашел эту страницу при отключении автоматической реконфигурации:

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

Cloud Foundry автоматически создаст для вас компонент RedisConnectionFactory, поэтому мой JedisConnectionFactory не использовался.

Мне пришлось отключить автоматическую реконфигурацию. Или, скорее, включите ручную настройку.

Затем начал создаваться экземпляр моего компонента JedisConnectionFactory (с включенным SSL) (вместе с компонентом RedisConnectionFactory от cloud service connector).

И мне пришлось установить для моего компонента JedisConnectionFactory значение Primary, поскольку теперь было два компонента connection factory.

Я также получал исключения о неожиданном завершении потока.

Мне пришлось включить usePooling в JedisClientConfiguration .

Здесь я опубликовал в jira сообщение о проблеме (теперь перенесено на github):

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

Комментарии:

1. Как вы создали RedisCacheManager, используя этот шаблон? Текущий конструктор — это RedisCacheManager(RedisOperations redisOperations) Затем он теперь изменен на RedisCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration)

2. @ash У меня возникли проблемы с настройкой usePooling , как мне это сделать? Я использую JedisConnectionFactor

3. @Ikaro Sales: jedisConfig = JedisClientConfiguration .builder() .useSSL() .usePooling() .build(); JedisConnectionFactory jcf = новый JedisConnectionFactory (redisConfig, jedisConfig);

4. @Vasudev: Я не использовал RedisCacheManager