2011-11-16 12 views
8

Sto utilizzando un client Apache CXF, eseguito in una VM di Windows Java 1.6.0_29-b11 per connettersi a un mainframe IBM (credo sia zSeries) e richiamare un SOAP Servizio Web in esecuzione lì. La connessione viene effettuata tramite SSL/TLS e la maggior parte delle volte funziona correttamente.Come risolvere l'eccezione SSL "bad record MAC"

Tuttavia, di volta in volta ho Eccezioni SSL con un messaggio bad record MAC. Ecco l'output del programma utilizzato con la proprietà 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) 

Purtroppo, non ho possibilità di modificare o eseguire il debug l'endpoint sul server.

Cosa potrebbe causare questo?

Come posso isolare e correggere questo comportamento?

+0

si tratta di una connessione wireless per caso? –

+0

possibile duplicato dell'errore SSL ["bad record MAC" tra Java e PortgreSQL] (http://stackoverflow.com/questions/2446292/bad-record-mac-ssl-error-between-java-and-portgresql) –

+0

è una connessione in fibra. Anche se non è troppo stabile .. –

risposta

14

Se si ottengono molti pacchetti danneggiati a causa di un errore nella rete, può capitare che un pacchetto difettoso sopravviva a caso al checksum TCP a 32 bit. Circa 1 su 4 miliardi di pacchetti danneggiati scorreranno via TCP. Una volta che questo pacchetto viene consegnato a SSL, sicuramente genererà un record MAC errato, poiché il Mac SSL ha una dimensione di 96 bit.

Se questa è la causa, l'unica soluzione è migliorare la rete.

+0

Stai dicendo che il checksum TCP è OK (quindi il pacchetto è accettato dallo stack di rete), ma i dati sono ancora corrotti? Questo ha senso .. –

+0

Sì, esattamente. Poiché il checksum TCP è solo 32 bit, circa 1 su 2 ** 32 pacchetti difettosi avranno un checksum TCP corretto. Quindi, se la tua rete sta generando un sacco di pacchetti cattivi, ciò può accadere. –

10

Questo non è legato a Java, è uno SSL/TLS fallimento:

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

Probabilmente ha qualcosa a che fare con l'implementazione SSL e la quantità di dati che vengono inviati di essere troppo grande, Dubito che sia random.

+2

Sì, sicuramente non è casuale, solo * sembra * casuale per me (non ho un modo per riprodurlo). C'è qualcosa che posso fare per eseguire il debug di più e sapere che cosa sta causando esattamente questo? –

Problemi correlati