如何将 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。
我还收到有关流意外结束的异常。
我必须打开usePooling
in 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 未加密连接被禁止”?的主要内容,如果未能解决你的问题,请参考以下文章