簡體   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