【问题标题】:Setting jdk.tls.client.protocols system property to TLSv1.2 not working in netty 4.1.48将 jdk.tls.client.protocols 系统属性设置为 TLSv1.2 在 netty 4.1.48 中不起作用
【发布时间】:2021-01-05 06:42:21
【问题描述】:

我们使用的是 Redisson 客户端,它使用 netty 连接到 Redis 服务器。使用 netty 4.1.42.Final,一切正常。但是升级到 netty 4.1.48.Final 后,TLSv1 ClientHello 被发送,因此无法连接到服务器。尝试通过设置 jdk.tls.client.protocols 系统属性来指定 TLSv1.2,但 netty 似乎没有兑现它。

打开 Java 跟踪后,在跟踪文件中可以看到以下内容:

使用 netty 4.1.48,默认协议只有 TLSv1:

jdk.tls.client.protocols is defined as TLSv1.2
SSLv3 protocol was requested but was not enabled
SUPPORTED: [TLSv1, TLSv1.1, TLSv1.2]
SERVER_DEFAULT: [TLSv1, TLSv1.1, TLSv1.2]
CLIENT_DEFAULT: [TLSv1.2]
IBMJSSE2 will enable CBC protection
12:00:41.624 [redisson-netty-2-9] DEBUG io.netty.handler.ssl.JdkSslContext - Default protocols (JDK): [TLSv1]

使用 netty 4.1.42,默认协议包括 TLSv1.2:

jdk.tls.client.protocols is defined as null
SSLv3 protocol was requested but was not enabled
SSLv3 protocol was requested but was not enabled
SUPPORTED: [TLSv1, TLSv1.1, TLSv1.2]
SERVER_DEFAULT: [TLSv1, TLSv1.1, TLSv1.2]
CLIENT_DEFAULT: [TLSv1, TLSv1.1, TLSv1.2]
10:18:00.008 [redisson-netty-2-23] DEBUG io.netty.handler.ssl.JdkSslContext - Default protocols (JDK): [TLSv1.2, TLSv1.1, TLSv1]

未设置 jdk.tls.client.protocols 系统属性时的 netty 4.1.48 跟踪:

jdk.tls.client.protocols is defined as null
SSLv3 protocol was requested but was not enabled
SSLv3 protocol was requested but was not enabled
SUPPORTED: [TLSv1, TLSv1.1, TLSv1.2]
SERVER_DEFAULT: [TLSv1, TLSv1.1, TLSv1.2]
CLIENT_DEFAULT: [TLSv1, TLSv1.1, TLSv1.2]
IBMJSSE2 will enable CBC protection
09:54:19.626 [redisson-netty-2-25] DEBUG io.netty.handler.ssl.JdkSslContext - Default protocols (JDK): [TLSv1] 

java -version 输出:

java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 8.0.5.27 - pwa6480sr5fp27-20190104_01(SR5 FP27))
IBM J9 VM (build 2.9, JRE 1.8.0 Windows 10 amd64-64-Bit Compressed References 20181219_405297 (JIT enabled, AOT enabled)
OpenJ9   - 3f2d574
OMR      - 109ba5b
IBM      - e2996d1)
JCL - 20190104_01 based on Oracle jdk8u191-b26

还有其他人遇到此问题或知道如何解决此问题吗?

谢谢!

【问题讨论】:

  • 您是否可以添加不使用 netty 4.1.48.Final 指定系统属性时记录的内容?
  • 另外请添加有关使用的java版本的详细信息:java -version
  • 我用 trace 和 Java 版本更新了帖子。

标签: netty redisson


【解决方案1】:

将 jdk.tls.client.protocols 系统属性设置为 TLSv1.2 在 netty 4.1.48 中不起作用

我不能 100% 确定我们的解决方案是否能解决您的问题,但我在您的跟踪日志中看到了 IBM。我们还遇到了在 Netty 中将默认密码设置为 TLSv1 的问题:

io.netty.handler.ssl.JdkSslContext.java:97 - Default protocols (JDK): [TLSv1]
io.netty.handler.ssl.JdkSslContext.java:98 - Default cipher suites (JDK):
    [TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_128_GCM_SHA256,
    TLS_RSA_WITH_AES_128_CBC_SHA]

结果证明这是 IBM JVM 的一个问题。以下代码在 AIX 下默认吐出 [TLSv1]。不好。在 Redhat 和 Solaris 下它会输出[TLSv1, TLSv1.1, TLSv1.2]

SSLContext context = SSLContext.getInstance("TLS");
context.init(null, null, null);
String[] supportedProtocols = context.getDefaultSSLParameters().getProtocols();
System.out.println(Arrays.toString(supportedProtocols));

根据这个IBM documentation等,解决方法是在JVM中添加如下属性:

-Dcom.ibm.jsse2.overrideDefaultTLS=true

我真的不喜欢这个答案,但我没有找到启用 TLSv1.2 的 java.security 文件行或其他系统范围的设置。以下是我正在使用的 JVM 的详细信息:

$ java -version
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 8.0.5.0 - pap6480sr5-20170905_01(SR5))
IBM J9 VM (build 2.9, JRE 1.8.0 AIX ppc64-64 Compressed References 20170901_363591
    (JIT enabled, AOT enabled)
J9VM - d56eb84
JIT  - tr.open_20170901_140853_d56eb84
OMR  - b033a01)
JCL - 20170823_01 based on Oracle jdk8u144-b01

【讨论】:

    猜你喜欢
    • 2016-11-11
    • 2017-04-17
    • 2011-05-18
    • 2017-02-18
    • 1970-01-01
    • 2011-10-28
    • 2016-07-02
    • 1970-01-01
    • 2014-02-04
    相关资源
    最近更新 更多