2011-11-16 38 views
8

Tôi đang sử dụng máy khách Apache CXF, chạy trên máy ảo Windows Java 1.6.0_29-b11 để kết nối với máy tính lớn của IBM (tôi tin là zSeries) và gọi SOAP Dịch vụ web đang chạy ở đó. Kết nối được thực hiện thông qua SSL/TLS và phần lớn thời gian hoạt động tốt.Cách khắc phục sự cố ngoại lệ SSL "bản ghi xấu MAC"

Tuy nhiên, đôi khi tôi có ngoại lệ SSL với thông báo bad record MAC. Đây là đầu ra của chương trình sử dụng với thuộc tính 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) 

Thật không may, tôi không có khả năng sửa đổi hoặc gỡ lỗi điểm cuối tại máy chủ.

Điều gì có thể gây ra điều này?

Tôi có thể cách ly và khắc phục hành vi này như thế nào?

+0

có kết nối không dây nào không? –

+0

có thể trùng lặp lỗi SSL ["bản ghi xấu MAC" giữa Java và PortgreSQL] (http://stackoverflow.com/questions/2446292/bad-record-mac-ssl-error-between-java-and-portgresql) –

+0

Điều này là một kết nối sợi quang. Mặc dù không phải là quá ổn định .. –

Trả lời

14

Nếu bạn nhận được rất nhiều gói dữ liệu xấu do một số lỗi trong mạng của bạn, có thể xảy ra một gói không hợp lệ ngẫu nhiên tồn tại trong tổng kiểm tra TCP 32 bit. Khoảng 1 trong 4 tỷ gói dữ liệu xấu sẽ bị trượt bởi TCP. Một khi gói này được gửi đến SSL, nó sẽ tạo ra một bản ghi MAC xấu chắc chắn, bởi vì máy Mac SSL có kích thước 96 bit.

Nếu đây là nguyên nhân, giải pháp duy nhất là cải thiện mạng.

+0

Bạn ngụ ý rằng kiểm tra TCP là OK (vì vậy gói được chấp nhận bởi ngăn xếp mạng), nhưng dữ liệu vẫn bị hỏng? Điều này có ý nghĩa .. –

+0

Vâng, chính xác. Bởi vì TCP checksum chỉ là 32 bit, khoảng 1 trong 2 ** 32 gói tin xấu sẽ có một checksum TCP chính xác. Vì vậy, nếu mạng của bạn đang tạo ra rất nhiều gói dữ liệu xấu thì điều này có thể xảy ra. –

10

này không liên quan đến Java, nó là một SSL/TLS thất bại:

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

Nó có thể có cái gì để làm với việc thực hiện SSL và số lượng dữ liệu đang được gửi quá lớn, Tôi nghi ngờ nó là ngẫu nhiên.

+2

Có, chắc chắn nó không phải là ngẫu nhiên, nó chỉ * có vẻ * ngẫu nhiên với tôi (tôi không có một cách để tái sản xuất nó). Có bất cứ điều gì tôi có thể làm để gỡ lỗi nó nhiều hơn và biết những gì đang gây ra điều này một cách chính xác? –

Các vấn đề liên quan