web-dev-qa-db-ja.com

SSL「不良レコードMAC」例外のトラブルシューティング方法

Windowsで実行されているApacheCXFクライアントを使用しています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)

残念ながら、サーバーでエンドポイントを変更またはデバッグする可能性はありません。

何が原因でしょうか?

この動作を分離して修正するにはどうすればよいですか?

10

ネットワークの障害が原因で多くの不良パケットを受信して​​いる場合、不良パケットがランダムに32ビットTCPチェックサム。40億分の1の不良パケットに耐える可能性があります。 SSL Macのサイズは96ビットであるため、このパケットがSSLに配信されると、確実に不良レコードMACが生成されます。

これが原因である場合、唯一の解決策はネットワークを改善することです。

一般に、これは非常にありそうもないレコードMACの不良の原因であることに注意してください。不良パケットを生成する障害のあるハードウェアを備えたネットワークでさえ、正しいIPとTCPメタデータを使用してパケットを生成する可能性は低く、パケットは実際にTLS接続に対応するソケットに渡されます。

16
James K Polk

これはJavaとは関係ありません、SSL/ [〜#〜] tls [〜#〜] 失敗です:

 20不正なレコードMACが致命的SSLの実装が不正であるか、ペイロード
が改ざんされている可能性があります。 FTPSサーバー上のFTPファイアウォールルール
。

それはおそらくSSLの実装と関係があり、送信されるデータの量が多すぎるので、ランダムではないかと思います。

11
user177800