2011-11-16 514 views
8

我使用Apache CXF的客戶端,在Windows的Java 1.6.0_29-B11 VM運行連接到IBM大型機(我相信這是z系列),並調用一個SOAP運行在那裏的Web服務。連接通過SSL/TLS完成,並且大部分時間都正常工作。如何解決SSL「不良記錄MAC」異常

但是,不時我有一個​​消息SSL例外。這是使用javax.net.debug屬性的程序的輸出。

2011-11-16 12:32:37,731 INFO LoggingOutInterceptor: Outbound Message 
--------------------------- 
ID: 29 
Address: https://1.2.3.4/access/servlet/blabla.atk123 
Encoding: UTF-8 
Content-Type: text/xml 
Headers: {Accept=[*/*], SOAPAction=["Blablaaction/ATK123.Execute"]} 
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ATK123.Execute xmlns="Blabla"><Usrid>WA</Usrid><Usrpwd>54321</Usrpwd><Ultautid>9999</Ultautid></ATK123.Execute></soap:Body></soap:Envelope> 
-------------------------------------- 
pool-1-thread-1, setSoTimeout(30000) called 
pool-1-thread-1, WRITE: TLSv1 Application Data, length = 321 
pool-1-thread-1, WRITE: TLSv1 Application Data, length = 262 
pool-1-thread-1, READ: TLSv1 Application Data, length = 483 
pool-1-thread-1, READ: TLSv1 Application Data, length = 16148 
pool-1-thread-1, READ: TLSv1 Application Data, length = 282 
%% Invalidated: [Session-1, SSL_RSA_WITH_RC4_128_SHA] 
pool-1-thread-1, SEND TLSv1 ALERT: fatal, description = bad_record_mac 
pool-1-thread-1, WRITE: TLSv1 Alert, length = 22 
pool-1-thread-1, called closeSocket() 
pool-1-thread-1, handling exception: javax.net.ssl.SSLException: bad record MAC 
2011-11-16 12:32:38,511 WARN PhaseInterceptorChain: Interceptor for {Blabla}ATK123#{Blabla}Execute has thrown exception, unwinding now 
org.apache.cxf.interceptor.Fault: bad record MAC 
    at org.apache.cxf.interceptor.LoggingInInterceptor.logging(LoggingInInterceptor.java:144) 
    at org.apache.cxf.interceptor.LoggingInInterceptor.handleMessage(LoggingInInterceptor.java:73) 
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263) 
    at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:797) 
.... (more stuff) 

不幸的是,我沒有修改或調試服務器端點的可能性。

這可能是什麼原因造成的?

如何分離並修復此問題?

+0

這是通過任何機會通過無線連接? [Java和PortgreSQL之間的 「不良記錄MAC」 SSL錯誤]的 –

+0

可能重複(http://stackoverflow.com/questions/2446292/bad-record-mac-ssl-error-between-java-and-portgresql) –

+0

這是光纖連接。雖然不太穩定.. –

回答

14

如果你得到了很多的壞包由於某種故障您的網絡中可能發生的是一個錯誤的數據包會隨機生存的32位TCP校驗。大約40億個壞包中有1個會被TCP丟棄。一旦這個數據包被傳送到SSL,它肯定會產生一個不好的記錄MAC,因爲SSL Mac的大小是96位。

如果這是原因,唯一的解決方案是改善網絡。

+0

您是否暗示TCP校驗和正確(因此數據包被網絡堆棧接受),但數據仍然損壞?這是有道理的.. –

+0

是的,確切地說。由於TCP校驗和只有32位,所以大約有1 2 ** 32個錯誤的數據包將具有正確的TCP校驗和。所以如果你的網絡產生很多壞包,這可能發生。 –

10

這是不是與Java,它是一個SSL/TLS失敗:

 
20 Bad record MAC fatal Possibly a bad SSL implementation, or payload 
          has been tampered with e.g. FTP firewall rule 
          on FTPS server. 

它可能有一些做的SSL實施和正在發送過於大的數據量,我懷疑這是隨機

+2

是的,它肯定不是隨機的,它只是*隨機給我(我沒有辦法重現它)。有什麼我可以做更多的調試,並知道是什麼原因導致這一切? –