Comment faire pour résoudre les SSL “mauvaise tenue de MAC” exception
Je suis en utilisant un Apache CXF client, en cours d'exécution dans Windows Java 1.6.0_29-b11 VM pour se connecter à un mainframe IBM (je crois que c'est zSeries), et l'invocation d'un Service Web SOAP fonctionne là-bas. La connexion se fait via le protocole SSL/TLS, et la plupart du temps fonctionne très bien.
Cependant, de temps en temps, j'ai SSL Exceptions avec un bad record MAC
message. Voici la sortie du programme d'aide à la javax.net.debug
propriété.
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)
Malheureusement, je n'ai pas de possibilités de modifier ou de débogage de l'extrémité au serveur.
Ce qui pourrait être la cause?
Comment puis-je isoler et de résoudre ce problème?
est-ce via une connexion sans fil par hasard?
double possible de "mauvaise tenue de MAC" erreur SSL entre Java et PortgreSQL
C'est une connexion en fibre. Bien que n'est pas trop stable..
Cela pourrait s'expliquer facilement si vous remarquez d'environ 4 milliards d'échec TCP sommes par mauvaise tenue de mac erreur.
Je pense que la raison la plus probable pour ceci est la suivante bug de Java: bugs.openjdk.java.net/browse/JDK-4615819 (ses dix ans mais n'a jamais été fixe sur le côté client)
double possible de "mauvaise tenue de MAC" erreur SSL entre Java et PortgreSQL
C'est une connexion en fibre. Bien que n'est pas trop stable..
Cela pourrait s'expliquer facilement si vous remarquez d'environ 4 milliards d'échec TCP sommes par mauvaise tenue de mac erreur.
Je pense que la raison la plus probable pour ceci est la suivante bug de Java: bugs.openjdk.java.net/browse/JDK-4615819 (ses dix ans mais n'a jamais été fixe sur le côté client)
OriginalL'auteur Camilo Díaz Repka | 2011-11-16
Vous devez vous connecter pour publier un commentaire.
Si vous obtenez beaucoup de paquets défectueux en raison d'une faute dans votre réseau, il peut arriver qu'un mauvais paquet au hasard survivre à la 32 bits de la somme de contrôle TCP. À propos de 1 à 4 milliards de paquets défectueux se glisser par TCP. Une fois ce paquet est livré à SSL, il va générer un mauvais enregistrement MAC sûr, parce que le SSL Mac est de 96 bits taille.
Si c'est la cause, la seule solution est d'améliorer le réseau.
Noter que, en général, c'est un très peu probable cause d'une mauvaise tenue de MAC. Même un réseau avec un matériel défectueux qui génère des paquets défectueux est peu probable de les générer avec la bonne IP et TCP métadonnées telles que les paquets sont passés à la prise correspondant à la connexion TLS.
Oui, exactement. Parce que le total de contrôle TCP n'est que de 32 bits, environ 1 à 2**32 paquets défectueux sera un bon total de contrôle TCP. Donc, si votre réseau est de générer beaucoup de paquets défectueux, cela peut arriver.
OriginalL'auteur James K Polk
Ce n'est pas lié à Java, c'est un SSL/TLS échec:
Il a probablement quelque chose à voir avec le protocole SSL, la mise en œuvre et la quantité de données qui est envoyé trop grande, je doute qu'il est aléatoire.
OriginalL'auteur