Как настроить JedisConnectionFactory для использования SSL, чтобы я не получал сообщение об ошибке: «JedisDataException: незашифрованное соединение ERR запрещено»?

У меня есть база данных Redis с пользовательским интерфейсом RLEC (RedisLabs Enterprise Cluster), настроенным для соединений 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());

Переменные окружения:

"-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, чтобы не было этой ошибки.

ты решил эту проблему

wthamira 28.04.2019 07:43

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

vivek kumar 03.06.2020 10:05
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
1
2
6 929
1

Ответы 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 автоматически создаст для вас bean-компонент RedisConnectionFactory, поэтому мой JedisConnectionFactory не использовался.

Пришлось отключить автоперенастройку. Или лучше включить ручную настройку.

Мой bean-компонент JedisConnectionFactory (с включенным SSL) затем начал создавать экземпляры (вместе с bean-компонентом RedisConnectionFactory соединителя облачных служб).

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

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

Пришлось включить usePoolingв JedisClientConfiguration.

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

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

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

Vasudev 28.07.2020 17:30

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

Ikaro Sales 27.05.2021 02:46

@Ikaro Sales: jedisConfig = JedisClientConfiguration .builder() .useSsl() .usePooling() .build(); JedisConnectionFactory jcf = new JedisConnectionFactory(redisConfig, jedisConfig);

ash 23.06.2021 00:08

@Vasudev: я не использовал RedisCacheManager

ash 23.06.2021 00:11

Другие вопросы по теме