【问题标题】:mTLS/TLS Redis 6 Issues JavamTLS/TLS Redis 6 问题 Java
【发布时间】:2023-03-23 14:47:01
【问题描述】:

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

追踪:

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 服务器调试日志:

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 代码:

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();

版本:

  • Lettuce 版本:6.0.0.M1(在本地 Windows 上运行)
  • Redis 版本:6.0.5(本地在 linux VM 上运行)

注意事项:

  • C# 客户端工作正常,因此怀疑是 Redis 服务器问题。
  • Redis URI(设置前打印在我的真实代码中):redis://localhost:6379

【问题讨论】:

    标签: java redis lettuce


    【解决方案1】:

    请检查您的客户端日志。

    16797:M 03 Aug 2020 09:11:11.246 # Error accepting a client connection: (null)
    

    当 Redis 无法继续连接阶段时,会出现上述消息。当 SSL 握手未成功完成时,SSL 安排中会出现此类消息,例如由证书验证失败引起的。

    查看上面的代码,客户端是这样创建的:

    RedisClient.create(RedisURI.Builder.redis(hostConfig,portConfig)                                      .withSsl(true).withVerifyPeer(false).build().toURI().toString());
    

    RedisURI 对象被转换为字符串,导致verifyPeer 标志丢失。

    请将您的代码更改为:

    RedisClient.create(RedisURI.Builder.redis(hostConfig,portConfig)                                      .withSsl(true).withVerifyPeer(false).build());
    

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2021-01-12
        • 1970-01-01
        • 1970-01-01
        • 2021-04-26
        • 2019-06-06
        • 2015-12-01
        • 1970-01-01
        • 2016-07-25
        • 1970-01-01
        相关资源
        最近更新 更多