为了账号安全,请及时绑定邮箱和手机立即绑定

java 11 HttpClient 导致无休止的 SSL 循环

java 11 HttpClient 导致无休止的 SSL 循环

小唯快跑啊 2022-06-04 09:36:13
我正在使用新 java.net.http.HttpClient的sendAsync方法。位于HttpClientSingelton 内部,并且像这样创建一次: HttpClient.newBuilder().build()所以真的没什么特别的。这些请求可能是POST,GET但我不知道是哪个导致了麻烦。一天只有几个请求,但有时一个线程会使用 100% 的 cpu 内核。不是马上,而是在请求完成一段时间后。因此,当甚至发生 2 个无限循环时,我进行了线程转储,以下 2 个线程脱颖而出:"HttpClient-4-Worker-5" #144 daemon prio=5 os_prio=0 cpu=511298.10ms elapsed=520.71s tid=0x00007f684403e800 nid=0x2d6b runnable  [0x00007f68ac162000]   java.lang.Thread.State: RUNNABLE        at jdk.internal.net.http.common.SSLFlowDelegate$Writer.processData(java.net.http@11.0.2/SSLFlowDelegate.java:771)        at jdk.internal.net.http.common.SSLFlowDelegate$Writer$WriterDownstreamPusher.run(java.net.http@11.0.2/SSLFlowDelegate.java:645)        at jdk.internal.net.http.common.SequentialScheduler$CompleteRestartableTask.run(java.net.http@11.0.2/SequentialScheduler.java:147)        at jdk.internal.net.http.common.SequentialScheduler$SchedulableTask.run(java.net.http@11.0.2/SequentialScheduler.java:198)        at jdk.internal.net.http.common.SequentialScheduler.runOrSchedule(java.net.http@11.0.2/SequentialScheduler.java:271)        at jdk.internal.net.http.common.SequentialScheduler.runOrSchedule(java.net.http@11.0.2/SequentialScheduler.java:224)        at jdk.internal.net.http.common.SSLFlowDelegate$Writer.triggerWrite(java.net.http@11.0.2/SSLFlowDelegate.java:722)        at jdk.internal.net.http.common.SSLFlowDelegate.doHandshake(java.net.http@11.0.2/SSLFlowDelegate.java:1024)        at jdk.internal.net.http.common.SSLFlowDelegate.doClosure(java.net.http@11.0.2/SSLFlowDelegate.java:1094)        at jdk.internal.net.http.common.SSLFlowDelegate$Reader.unwrapBuffer(java.net.http@11.0.2/SSLFlowDelegate.java:500)        at jdk.internal.net.http.common.SSLFlowDelegate$Reader.processData(java.net.http@11.0.2/SSLFlowDelegate.java:389)相同的观察结果,但在另一个容器上只有一个线程受到影响。
查看完整描述

3 回答

?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

正如@jspcal 在禁用 TLS 1.3 之前所说。


tl;dr:通过扩展/覆盖禁用 tlsv1.3


<java_home>/conf/security/java.securityjdk.tls.disabledAlgorithms财产_


由于我的应用程序在 docker 容器中运行,因此我将基础映像更改为禁用 tls1.3


FROM openjdk:11-jre

...


RUN sed -i "/jdk.tls.disabledAlgorithms=/ s/=.*/=TLSv1.3, SSLv3, RC4, MD5withRSA, DH keySize < 1024, EC keySize < 224, DES40_CBC, RC4_40, 3DES_EDE_CBC/" $(readlink -f /usr/bin/java | sed "s:bin/java::")/conf/security/java.security

据我所知,无法通过系统属性设置此(安全)属性!另请参阅sun.security.util.DisabledAlgorithmConstraints#PROPERTY_TLS_DISABLED_ALGS实际准备好的属性。


更新:错误仍然存在于 11.0.2


查看完整回答
反对 回复 2022-06-04
?
三国纷争

TA贡献1804条经验 获得超7个赞

尝试禁用TLSv1.3SSLv3查看是否有帮助。

在命令行上设置系统属性:-Djdk.tls.disabledAlgorithms=TLSv1.3

或者在中定义属性<java_home>/conf/security/java.security

如果您认为这是一个实现错误,您可能需要打开一个问题。


查看完整回答
反对 回复 2022-06-04
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

该错误已针对 11.0.10 Java 版本进行了修复。



查看完整回答
反对 回复 2022-06-04
  • 3 回答
  • 0 关注
  • 148 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信