【问题标题】:How to troubleshoot SSL "bad record MAC" exception如何解决 SSL“坏记录 MAC”异常
【发布时间】:2011-12-30 13:49:15
【问题描述】:

我正在使用 Apache CXF 客户端,在 Windows Java 1.6.0_29-b11 VM 中运行以连接到 IBM 大型机(我相信它是 zSeries),并调用在那里运行的 SOAP Web 服务。连接是通过 SSL/TLS 完成的,并且大部分时间都可以正常工作。

但是,我有时会遇到带有bad record 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)

不幸的是,我无法在服务器上修改或调试端点。

这可能是什么原因造成的?

如何隔离和修复此行为?

【问题讨论】:

标签: java sockets networking ssl


【解决方案1】:

如果由于网络中的某些故障而收到大量坏包,则坏包可能会随机通过 32 位 TCP 校验和。大约每 40 亿个坏包中就有 1 个会被 TCP 遗漏。一旦这个数据包被传送到 SSL,它肯定会生成一个坏记录 MAC,因为 SSL Mac 的大小是 96 位。

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

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

【讨论】:

  • 您是否暗示 TCP 校验和正常(因此数据包被网络堆栈接受),但数据仍然损坏?这是有道理的..
  • 是的,完全正确。因为 TCP 校验和只有 32 位,所以大约每 2**32 个坏包中就有 1 个具有正确的 TCP 校验和。因此,如果您的网络生成大量不良数据包,则可能会发生这种情况。
【解决方案2】:

这与 Java 无关,是 SSL/TLS 失败:

20 错误记录 MAC 致命 可能是错误的 SSL 实现,或有效负载 已被篡改,例如FTP防火墙规则 在 FTPS 服务器上。

这可能与 SSL 实现有关,并且发送的数据量太大,我怀疑它是随机

【讨论】:

  • 是的,它肯定不是随机的,它只是似乎对我来说是随机的(我没有办法重现它)。我可以做些什么来调试它并确切地知道是什么原因造成的?
猜你喜欢
  • 2020-08-15
  • 1970-01-01
  • 2019-07-11
  • 2013-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
相关资源
最近更新 更多