提问者:小点点

Java1.8。0_271不符合TLSRFC:握手期间,服务器关闭传输控制协议,没有close_notify或警报


我们以前在旧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

握手是使用TLS1.3进行的。

这似乎非常不寻常。我通读了RFC8446(安全传输层协议(TLS)协议版本1.3),我找不到任何理由为什么服务器会在不先发送警报或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.

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

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


共2个答案

匿名用户

作为一种解决方法,您可以尝试在Java1.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年,是为1.4JDK构建的。它包含一个org. bouncycast.jce.Provider类。

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

现在,还有一件事我不太确定:当我们启动Weblogic时,它在5-40分钟内运行良好。它能够处理数百个客户端请求并TLS握手。有一次,它就停止了工作:所有以前处理良好的TLS握手现在都收到了TCPFIN。这几乎就像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)