У меня есть база данных 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, чтобы не было этой ошибки.
Есть новости по этому поводу? Я столкнулся с той же проблемой и хочу подключить Redis к ssl.




Отредактировано.
Напомним, что я мог подключиться к Redis с включенным SSL с библиотекой Jedis, но не с библиотекой Spring JedisConnectionFactory.
Я пробовал это в Pivotal Cloud Foundry (PCF).
Я написал Марку Палуху, автору spring-data-redis, и он предложил отключить автоматическую перенастройку, чтобы заставить ее работать в PCF.
Я нашел эту страницу об отключении автоматической перенастройки:
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)
@ash У меня проблемы с настройкой usePooling, как мне это сделать? Я использую JedisConnectionFactor
@Ikaro Sales: jedisConfig = JedisClientConfiguration .builder() .useSsl() .usePooling() .build(); JedisConnectionFactory jcf = new JedisConnectionFactory(redisConfig, jedisConfig);
@Vasudev: я не использовал RedisCacheManager
ты решил эту проблему