Как устранить неполадки SSL «неверная запись MAC» исключение - PullRequest
10 голосов
/ 16 ноября 2011

Я использую клиент Apache CXF, работающий на виртуальной машине Windows Java 1.6.0_29-b11 для подключения к мэйнфрейму IBM (я полагаю, что это zSeries) и вызываю работающую там веб-службу SOAP.Соединение осуществляется через SSL / TLS, и большую часть времени работает нормально.

Однако время от времени у меня возникают исключения SSL с сообщением bad record MAC.Вот выходные данные программы, которые используются со свойством 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)

К сожалению, у меня нет возможности изменить или отладить конечную точку на сервере.

Что может быть причиной этого?

Как я могу изолировать и исправить это поведение?

Ответы [ 2 ]

16 голосов
/ 17 ноября 2011

Если вы получаете много плохих пакетов из-за какой-то неисправности в вашей сети, может случиться так, что плохой пакет в случайном порядке переживет 32-битную контрольную сумму TCP. Приблизительно 1 из 4 миллиардов плохих пакетов проскользнет по TCP. Как только этот пакет будет доставлен в SSL, он наверняка сгенерирует неверную запись MAC, поскольку размер SSL для Mac составляет 96 бит.

Если это причина, единственное решение - улучшить сеть.

Обратите внимание, что, как правило, это маловероятная причина плохой записи MAC. Даже сеть с неисправным оборудованием, которая генерирует плохие пакеты, вряд ли будет генерировать их с правильными метаданными IP и TCP, так что пакеты фактически передаются в сокет, соответствующий соединению TLS.

11 голосов
/ 16 ноября 2011

Это не относится к 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, а объем передаваемых данных слишком велик, я сомневаюсь, что это random .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...