web-dev-qa-db-fra.com

Obtention de "SSL: alerte [" écriture "]: fatal: mauvais enregistrement mac" lors de la prise de contact avec openssl

Je reçois SSL: alert ["write"]: fatal : bad record mac des journaux OPENSSL pendant la prise de contact et le client n'envoie pas les données d'application et crée la prise de contact encore et encore.

Quel pourrait être le problème, s'il vous plaît, quelqu'un m'aide-t-il?

12
Kalai

Un tel message est envoyé par une partie (par exemple le serveur) à l'autre partie (par exemple le client) pour signifier qu'il a eu un problème avec les éléments cryptographiques envoyés par cette partie. nominalement , cela se produit dans les conditions suivantes:

bad_record_mac
   This alert is returned if a record is received with an incorrect
   MAC.  This alert also MUST be returned if an alert is sent because
   a TLSCiphertext decrypted in an invalid way: either it wasn't an
   even multiple of the block length, or its padding values, when
   checked, weren't correct.  This message is always fatal and should
   never be observed in communication between proper implementations
   (except when messages were corrupted in the network).

Dans la négociation SSL/TLS, le premier message crypté envoyé par une partie est le message de négociation Finished qui précède les données de l'application. Lorsque le crypto a mal tourné, cela apparaîtra à ce moment-là, avec le bad_record_mac alerte.

Il faut noter que lorsque l'échange de clé asymétrique échoue, par ex. si le serveur a tenté de déchiffrer le "secret pré-maître" chiffré par RSA envoyé par le client mais n'a pas trouvé de message RSA correctement chiffré, la plupart des implémentations de serveur modernes continueront avec un secret pré-maître aléatoire. Il s'agit d'une défense contre attaques Bleichenbacher , qui essaient d'obtenir des informations supplémentaires sur la clé privée du serveur en essayant de deviner si le déchiffrement a échoué au stade RSA, ou plus tard. Pour contrer ces attaques, les serveurs "retardent" les erreurs jusqu'aux messages Finished, et essaieront vraiment fort pas pour expliquer la cause exacte de l'erreur. Donc pendant bad_record_mac est nominalement un problème avec la couche de vérification d'intégrité, de telles erreurs auront tendance à apparaître pour n'importe quel problème lié à la cryptographie.

Une cause plausible serait la suivante: le client utilise une prétendue clé publique de serveur qui ne correspond pas pas à la réalité clé privée du serveur. Normalement, le client extrait la clé publique du serveur du serveur certificat, que le serveur envoie au client pendant la prise de contact. Le serveur possède également une clé privée, qui est mathématiquement liée à la clé publique. Si le serveur est configuré pour utiliser le mauvais fichier, vous pouvez obtenir les symptômes que vous observez.

Je vous suggère d'utiliser un outil de surveillance réseau (tel que Wireshark ) pour observer les messages de prise de contact: vous devriez voir le message Certificate du serveur, contenant la chaîne de certificats du serveur; pour le premier certificat de cette chaîne, vous pouvez extraire la clé publique du serveur, que le client utilisera. Sur le serveur, essayez d'imprimer le serveur privé les détails de la clé (que cela soit facile ou non dépend du logiciel impliqué et du stockage de clé réel), pour voir s'ils correspondent.

D'autres causes possibles impliquent des implémentations boguées de certains algorithmes cryptographiques (sur le client et/ou le serveur). Il peut être difficile de localiser ces erreurs.

Pour obtenir plus de détails de débogage, vous pouvez également essayer de vous connecter au serveur avec l'outil de ligne de commande openssl:

openssl s_client -connect theservername:443 -msg -debug

Essayez également de jouer avec certaines des options pour sélectionner la version du protocole (-ssl2, -ssl3, -tls1...) et les suites de chiffrement prises en charge (-ciphers). En fin de compte, vous pouvez même recompiler votre propre version de OpenSSL avec du code de débogage personnalisé inséré (pour imprimer des valeurs intermédiaires, etc.). OpenSSL est open source, c'est donc techniquement faisable, si vous avez des connaissances en programmation C.

Une certaine maîtrise des détails du protocole SSL vous aidera. Voir cette réponse comme point de départ.

18
Tom Leek