Java 如何排除SSL故障“;“坏记录MAC”;例外

Java 如何排除SSL故障“;“坏记录MAC”;例外,java,sockets,networking,ssl,Java,Sockets,Networking,Ssl,我正在使用ApacheCXF客户机,运行在WindowsJava1.6.0īb11虚拟机中,连接到IBM大型机(我相信它是zSeries),并调用运行在那里的SOAP Web服务。连接是通过SSL/TLS完成的,大多数情况下工作正常 但是,我有时会遇到SSL异常,并出现坏记录MAC消息。下面是使用javax.net.debug属性的程序的输出 2011-11-16 12:32:37,731 INFO LoggingOutInterceptor: Outbound Message -------

我正在使用ApacheCXF客户机,运行在WindowsJava1.6.0īb11虚拟机中,连接到IBM大型机(我相信它是zSeries),并调用运行在那里的SOAP Web服务。连接是通过SSL/TLS完成的,大多数情况下工作正常

但是,我有时会遇到SSL异常,并出现
坏记录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)
2011-11-16 12:32:37731信息记录外出接收者:外出消息
---------------------------
身份证号码:29
地址:https://1.2.3.4/access/servlet/blabla.atk123
编码:UTF-8
内容类型:text/xml
标题:{Accept=[*/*],SOAPAction=[“Blablaaction/ATK123.Execute”]}
有效载荷:WA543219999
--------------------------------------
池-1-线程-1,设置超时(30000)调用
池-1-线程-1,写入:TLSv1应用程序数据,长度=321
池-1-线程-1,写入:TLSv1应用程序数据,长度=262
池-1-线程-1,读取:TLSv1应用程序数据,长度=483
池-1-线程-1,读取:TLSv1应用程序数据,长度=16148
池-1-线程-1,读取:TLSv1应用程序数据,长度=282
%%无效:[会话1,SSL\u RSA\u与\u RC4\u 128\u SHA]
池-1-线程-1,发送TLSv1警报:致命,描述=坏记录\u mac
池-1-线程-1,写入:TLSv1警报,长度=22
池-1-thread-1,称为closeSocket()
pool-1-thread-1,处理异常:javax.net.ssl.SSLException:坏记录MAC
2011-11-16 12:32:38511警告阶段InterceptorChain:{Blabla}ATK123{Blabla}执行的拦截器引发异常,正在解除
org.apache.cxf.interceptor.Fault:错误记录MAC
位于org.apache.cxf.interceptor.loggininginterceptor.logging(LoggingInInterceptor.java:144)
位于org.apache.cxf.interceptor.loggininterceptor.handleMessage(LoggingInInterceptor.java:73)
位于org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)
位于org.apache.cxf.endpoint.clientmpl.onMessage(clientmpl.java:797)
.... (更多内容)
不幸的是,我无法在服务器上修改或调试端点

这可能是什么原因造成的


如何隔离和修复此行为?

这与Java无关,它是SSL/故障:

20错误记录MAC致命可能是错误的SSL实现或负载 已被篡改,例如FTP防火墙规则 在FTPS服务器上。
这可能与SSL实现和发送的数据量太大有关,我怀疑这是随机的。如果由于网络中的某些故障而收到大量坏数据包,那么坏数据包可能会在32位TCP校验和中随机存活。大约40亿个坏数据包中有1个会通过TCP传输。一旦这个数据包被传送到SSL,它肯定会生成一个坏记录MAC,因为SSL MAC的大小是96位

如果这是原因,唯一的解决办法就是改善网络


请注意,一般来说,这是一个非常不可能的原因坏记录的MAC。即使是硬件有故障且生成坏数据包的网络也不太可能使用正确的IP和TCP元数据生成坏数据包,从而使数据包实际传递到与TLS连接相对应的套接字。

这是通过无线连接实现的吗?可能的重复是光纤连接。虽然不太稳定。如果你注意到每一个坏记录mac错误有40亿失败的TCP校验和,这很容易解释。我认为更可能的原因是以下Java错误:(它有十年历史,但从未在客户端修复过)是的,当然它不是随机的,在我看来它只是随机的(我没有办法重现它)。我能做些什么来进一步调试它,并确切地知道是什么导致了这种情况?您是否暗示TCP校验和是正常的(因此数据包被网络堆栈接受),但数据仍然被损坏?这是有道理的……是的,没错。由于TCP校验和仅为32位,因此每2**32个坏数据包中约有1个具有正确的TCP校验和。因此,如果您的网络正在生成大量坏数据包,则可能会发生这种情况。 20 Bad record MAC fatal Possibly a bad SSL implementation, or payload has been tampered with e.g. FTP firewall rule on FTPS server.