首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mTLS/TLS Redis 6期Java

mTLS/TLS Redis 6期Java
EN

Stack Overflow用户
提问于 2020-07-30 16:33:33
回答 2查看 2K关注 0票数 3

目前,我正在用ACL运行Redis 6,用mTLS运行C#客户端也不错。我正在尝试更新我们的Java端,使其也使用ACL和mTLS,但是遇到了一些问题。目前我主要关注的是mTLS,并且一直没有得到任何进展。这可能是用户的错误,因为我在尝试使用Java之前已经5-6年没有使用Java了,所以请告知。不知道什么或如何真正从这个错误中取得进展,我已经做了谷歌搜索,但没有真正成功。任何帮助都非常感谢,同样,我已经很长时间没有做Java了,所以很可能是问题所在。

追踪:

代码语言:javascript
复制
Caused by: io.lettuce.core.RedisConnectionException: Unable to connect to localhost:6379
        at io.lettuce.core.RedisConnectionException.create(RedisConnectionException.java:78)
        at io.lettuce.core.RedisConnectionException.create(RedisConnectionException.java:56)
        at io.lettuce.core.AbstractRedisClient.getConnection(AbstractRedisClient.java:295)
        at io.lettuce.core.RedisClient.connect(RedisClient.java:214)
        at io.lettuce.core.RedisClient.connect(RedisClient.java:199)
        at blah blah blah my code....
        ... 48 more
Caused by: javax.net.ssl.SSLException: SSLEngine closed already
        at io.netty.handler.ssl.SslHandler.wrap(SslHandler.java:834)
        at io.netty.handler.ssl.SslHandler.wrapAndFlush(SslHandler.java:797)
        at io.netty.handler.ssl.SslHandler.handleUnwrapThrowable(SslHandler.java:1254)
        at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1230)
        at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1271)
        at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:505)
        at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:444)
        at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:283)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352)
        at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1422)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)
        at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:931)
        at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163)
        at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:700)
        at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:635)
        at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:552)
        at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:514)
        at io.netty.util.concurrent.SingleThreadEventExecutor$6.run(SingleThreadEventExecutor.java:1044)
        at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
        ... 2 more

Redis服务器调试日志:

代码语言:javascript
复制
1:M 30 Jul 2020 15:23:10.837 - Accepted 10.0.2.2:62023
1:M 30 Jul 2020 15:23:11.024 # Error accepting a client connection: (null)

Java代码:

代码语言:javascript
复制
final RedisClient client = RedisClient.create(RedisURI.Builder.redis(hostConfig,portConfig)
                                      .withSsl(true).withVerifyPeer(false).build().toURI().toString());
if (redisTruststorePath != null && !redisTruststorePath.isEmpty()) {
            SslOptions sslOptions;
            if (redisKeystorePath != null && !redisKeystorePath.isEmpty()) {
                sslOptions = SslOptions.builder()
                        .jdkSslProvider()
                        .keystore(new File(redisKeystorePath), redisKeystorePass)
                        .truststore(new File(redisTruststorePath), redisTruststorePass)
                        .build();
            }
            else {
                sslOptions = SslOptions.builder()
                        .jdkSslProvider()
                        .truststore(new File(redisTruststorePath), redisTruststorePass)
                        .build();
            }
            client.setOptions(ClientOptions.builder().sslOptions(sslOptions).build());
        }
client.connect();

版本:

  • 生菜版本: 6.0.0.M1 (在本地windows上运行)
  • Redis版本: 6.0.5 (在本地linux上运行)

备注:

  • C#客户端运行良好,因此怀疑这是Redis问题。
  • Redis URI (在设置前以我的真实代码打印):rediss://localhost:6379
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-03 07:16:04

请查查你的客户记录。

代码语言:javascript
复制
16797:M 03 Aug 2020 09:11:11.246 # Error accepting a client connection: (null)

当Redis无法继续连接阶段时,上面的消息就会发生。这样的消息发生在SSL安排中,当SSL握手没有成功完成时,例如由于证书验证失败而导致的。

查看上面的代码,客户端创建时:

代码语言:javascript
复制
RedisClient.create(RedisURI.Builder.redis(hostConfig,portConfig)                                      .withSsl(true).withVerifyPeer(false).build().toURI().toString());

RedisURI对象被转换成一个字符串,这将导致verifyPeer标志的丢失。

请将代码更改为:

代码语言:javascript
复制
RedisClient.create(RedisURI.Builder.redis(hostConfig,portConfig)                                      .withSsl(true).withVerifyPeer(false).build());

通过删除.toURI().toString()

票数 2
EN

Stack Overflow用户

发布于 2020-08-03 15:42:23

正如@mp911de提到的,我删除了.toURI().toString();以及更新为莴苣核心6.0.0.RC,并开始使用RESP2 (如建议的这里)。这解决了我的问题。我认为这里的主要解决方案是切换到RESP2,这也是来自@mp911de的建议。谢谢您的帮助@mp911de

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63177538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档