繁体   English   中英

Java 1.8.0_271 不符合 TLS RFC:在握手期间,服务器关闭 TCP 连接而没有 close_notify 或警报

[英]Java 1.8.0_271 non-compliant to TLS RFC: during handshake, server closes TCP connection without close_notify or alert

我们曾经在旧的 java 版本 (1.8.0_51) 上使用 Weblogic 12c 服务器。 升级到 1.8.0_271 后,我们遇到间歇性问题:正常工作几分钟后,传入 Weblogic 的 TLS 握手失败。

观察到的行为如下:

Client --[TCP SYN]--> Weblogic
Weblogic --[TCP SYN, ACK]--> Client
Client --[TCP ACK]--> Weblogic
Client --[Client Hello]--> Weblogic
Weblogic --[TCP FIN, ACK]--> Client

正在使用 TLS 1.3 进行握手。

这看起来很不寻常。 我通读了 RFC 8446(传输层安全性 (TLS) 协议版本 1.3),但我无法找到服务器关闭 TCP 连接而不先发送警报或 close_notify 的任何原因。 我什至会说,根据我的理解,JVM 行为是不合规的:

   Each party MUST send a "close_notify" alert before closing its write
   side of the connection, unless it has already sent some error alert.

回到 Java 1.8.0_51 正在解决这个问题。

我们在 Linux 和 Solaris 服务器上都有这个问题,我们在远程和本地进行测试时看到这个问题(在服务器的 CLI 上,使用 openssl s_client)。 因此,防火墙、WAF、IPS 或其他任何东西都不可能导致此问题。

作为解决方法,您可以尝试在Java 1.8.0_271版本上禁用TLSv1.3

即使有更一致的方法来这样做,为了快速测试它,您也可以动态定义它; 将这句话直接放在你的代码中,连接相关方法之前:

java.lang.System.setProperty("jdk.tls.client.protocols", "TLSv1,TLSv1.1,TLSv1.2");

另一种选择是静态定义它。 例如,从终端启动它时:

$ java -Djdk.tls.client.protocols="TLSv1,TLSv1.1,TLSv1.2" YourJavaProgram

这将禁用列表中未包含的任何协议,因此您的客户端永远不会接受任何TLSV1.3 服务器现在将请求其列表中的下一个协议,默认TLSv1.2 这在您这边已正确启用,并且似乎在您的环境中没有问题。

我没看错, 1.8.0_271更改了一些关于 TLS3 的规范,例如允许的最大证书数量等。核心问题可能与此规范有关。 此变通方法与其说是解决方案,不如说是临时修复,但仍然希望它能以某种方式提供帮助。

我想我终于找到了这个问题的原因:在 CLASSPATH 中找到了这个 JAR:bcmail-jdk14-1.38.jar。 它是从 2008 年开始为 JDK 1.4 构建的。 它包含一个 org.bouncycastle.jce.provider class。

当我们启用 Weblogic 的 SSL 调试时,我们可以看到它是原因 - 这是使用过时的 Bouncy Castle 库时已知会发生的问题。

现在,还有一件事我不太确定:当我们启动 Weblogic 时,它可以正常运行 5-40 分钟。 它能够处理数百个客户端请求和 TLS 握手。 在某一时刻,它只是停止工作:所有之前可以正常处理的 TLS 握手现在都收到 TCP FIN。 这几乎就像 bouncycastle JCE 提供程序在长时间延迟后在运行时覆盖默认的 JCE 提供程序。 我不确定这是否可能。

####<2020-12-07 15 h 53> <Debug> <SecuritySSL> <hostname.domain.com> <AdminServer> <ExecuteThread: '1' for queue: 'weblogic.socket.Muxer'> <<WLS Kernel>> <> <5226be2e-62b3-4804-8063-b75cf217d5f2-00000068> <1607374405613> <[severity-value: 128] [rid: 0] [partition-id: 0] [partition-name: DOMAIN] > <BEA-000000> <[Thread[ExecuteThread: '1' for queue: 'weblogic.socket.Muxer',5,Thread Group for Queue: 'weblogic.socket.Muxer']]weblogic.security.SSL.jsseadapter: SSLENGINE: Exception occurred during SSLEngine.unwrap(ByteBuffer,ByteBuffer[]).
java.lang.RuntimeException: Could not generate ECDH keypair
    at sun.security.ssl.ECDHKeyExchange$ECDHEPossession.<init>(ECDHKeyExchange.java:116)
    at sun.security.ssl.ECDHKeyExchange$ECDHEPossessionGenerator.createPossession(ECDHKeyExchange.java:230)
    at sun.security.ssl.SSLKeyExchange$T12KeyAgreement.createPossession(SSLKeyExchange.java:377)
    at sun.security.ssl.SSLKeyExchange.createPossessions(SSLKeyExchange.java:88)
    at sun.security.ssl.ServerHello$T12ServerHelloProducer.chooseCipherSuite(ServerHello.java:432)
    at sun.security.ssl.ServerHello$T12ServerHelloProducer.produce(ServerHello.java:294)
    at sun.security.ssl.SSLHandshake.produce(SSLHandshake.java:420)
    at sun.security.ssl.ClientHello$T12ClientHelloConsumer.consume(ClientHello.java:964)
    at sun.security.ssl.ClientHello$ClientHelloConsumer.onClientHello(ClientHello.java:718)
    at sun.security.ssl.ClientHello$ClientHelloConsumer.consume(ClientHello.java:683)
    at sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:376)
    at sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:444)
    at sun.security.ssl.SSLEngineImpl$DelegatedTask$DelegatedAction.run(SSLEngineImpl.java:983)
    at sun.security.ssl.SSLEngineImpl$DelegatedTask$DelegatedAction.run(SSLEngineImpl.java:970)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.security.ssl.SSLEngineImpl$DelegatedTask.run(SSLEngineImpl.java:917)
    at weblogic.socket.JSSEFilterImpl.doTasks(JSSEFilterImpl.java:211)
    at weblogic.socket.JSSEFilterImpl.doHandshake(JSSEFilterImpl.java:113)
    at weblogic.socket.JSSEFilterImpl.isMessageComplete(JSSEFilterImpl.java:308)
    at weblogic.socket.SocketMuxer.readReadySocketOnce(SocketMuxer.java:975)
    at weblogic.socket.SocketMuxer.readReadySocket(SocketMuxer.java:916)
    at weblogic.socket.NIOSocketMuxer.process(NIOSocketMuxer.java:596)
    at weblogic.socket.NIOSocketMuxer.processSockets(NIOSocketMuxer.java:560)
    at weblogic.socket.SocketReaderRequest.run(SocketReaderRequest.java:30)
    at weblogic.socket.SocketReaderRequest.execute(SocketReaderRequest.java:43)
    at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:147)
    at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:119)
Caused By: java.security.InvalidAlgorithmParameterException: parameter object not a ECParameterSpec
    at org.bouncycastle.jce.provider.JDKKeyPairGenerator$EC.initialize(Unknown Source)
    at sun.security.ssl.ECDHKeyExchange$ECDHEPossession.<init>(ECDHKeyExchange.java:111)
    at sun.security.ssl.ECDHKeyExchange$ECDHEPossessionGenerator.createPossession(ECDHKeyExchange.java:230)
    at sun.security.ssl.SSLKeyExchange$T12KeyAgreement.createPossession(SSLKeyExchange.java:377)
    at sun.security.ssl.SSLKeyExchange.createPossessions(SSLKeyExchange.java:88)
    at sun.security.ssl.ServerHello$T12ServerHelloProducer.chooseCipherSuite(ServerHello.java:432)
    at sun.security.ssl.ServerHello$T12ServerHelloProducer.produce(ServerHello.java:294)
    at sun.security.ssl.SSLHandshake.produce(SSLHandshake.java:420)
    at sun.security.ssl.ClientHello$T12ClientHelloConsumer.consume(ClientHello.java:964)
    at sun.security.ssl.ClientHello$ClientHelloConsumer.onClientHello(ClientHello.java:718)
    at sun.security.ssl.ClientHello$ClientHelloConsumer.consume(ClientHello.java:683)
    at sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:376)
    at sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:444)
    at sun.security.ssl.SSLEngineImpl$DelegatedTask$DelegatedAction.run(SSLEngineImpl.java:983)
    at sun.security.ssl.SSLEngineImpl$DelegatedTask$DelegatedAction.run(SSLEngineImpl.java:970)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.security.ssl.SSLEngineImpl$DelegatedTask.run(SSLEngineImpl.java:917)
    at weblogic.socket.JSSEFilterImpl.doTasks(JSSEFilterImpl.java:211)
    at weblogic.socket.JSSEFilterImpl.doHandshake(JSSEFilterImpl.java:113)
    at weblogic.socket.JSSEFilterImpl.isMessageComplete(JSSEFilterImpl.java:308)
    at weblogic.socket.SocketMuxer.readReadySocketOnce(SocketMuxer.java:975)
    at weblogic.socket.SocketMuxer.readReadySocket(SocketMuxer.java:916)
    at weblogic.socket.NIOSocketMuxer.process(NIOSocketMuxer.java:596)
    at weblogic.socket.NIOSocketMuxer.processSockets(NIOSocketMuxer.java:560)
    at weblogic.socket.SocketReaderRequest.run(SocketReaderRequest.java:30)
    at weblogic.socket.SocketReaderRequest.execute(SocketReaderRequest.java:43)
    at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:147)
    at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:119)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM