Message d’erreur
dkim=fail (body hash did not verify)
Également affiché sous la forme
- dkim=neutral (body hash did not verify)
mailauth écrit `dkim=fail (body hash did not verify)` en mode strict et `dkim=neutral (body hash did not verify)` dans son mode permissif par défaut (les deux reproduits avec 8.0.1). OpenDKIM signale la même situation par `dkim=fail reason="signature verification failed"` (reproduit avec 2.11.0).
DKIM verifiers (Gmail, mailauth, Rspamd…) — Authentication-Results after the body changed in transit
Ce que cela signifie
La balise `bh=` de la signature DKIM contient un condensat du corps du message tel que l’expéditeur l’a signé. Le destinataire a haché le corps reçu (après canonicalisation) et a obtenu une valeur différente : le corps a donc changé en transit. La signature des en-têtes n’était même pas en cause : la RFC 6376 fait d’une non-concordance du condensat du corps un échec permanent. Les coupables classiques sont les pieds de page des listes de diffusion, les avertissements juridiques et les passerelles de sécurité qui réécrivent les liens.
Pourquoi cela se produit
Un pied de page ou un avertissement a été ajouté
fréquenteLes listes de diffusion (pied de page de désabonnement), les avertissements d’entreprise ajoutés par une passerelle sortante ou les lignes « Sent from… » ajoutées par des relais modifient le corps canonicalisé.
Une passerelle de sécurité a réécrit le corps
fréquenteRéécriture des liens (Safe Links, URL defense), suppression des pièces jointes ou insertion de bannières par des filtres entrants ou sortants.
L’encodage de transfert MIME a changé
occasionnelleUn relais sans 8BITMIME convertit le contenu 8 bits en quoted-printable ou en base64. Le texte décodé est identique ; les octets signés ne le sont pas.
Le signataire a haché des fins de ligne différentes
occasionnelleUn code de signature qui hache des fins de ligne LF alors que le message est envoyé en CRLF (ou que ses espaces de fin de ligne sont supprimés plus tard) produit un condensat du corps qui ne correspond jamais avec la canonicalisation `simple`.
Comment corriger l’erreur
- 1.
Recalculer bh= par vous-même
Comparer un condensat du corps recalculé sur la copie envoyée et sur la copie reçue vous indique si la faute revient au signataire ou à un relais.
bash # Recompute bh= for relaxed body canonicalization and compare with the header's bh= value python3 - message.eml <<'EOF' import base64, hashlib, re, sys raw = open(sys.argv[1], "rb").read().replace(b"\r\n", b"\n") body = raw.split(b"\n\n", 1)[1] lines = [re.sub(rb"[ \t]+", b" ", l).rstrip(b" \t") for l in body.split(b"\n")] canon = b"\r\n".join(lines).rstrip(b"\r\n") + b"\r\n" print("computed bh=", base64.b64encode(hashlib.sha256(canon).digest()).decode()) EOF grep -o "bh=[^;]*" message.eml - 2.
Signer après chaque modification
Faites du signataire DKIM la dernière étape de votre chemin sortant ; pour les intermédiaires que vous ne contrôlez pas, appuyez-vous dans la mesure du possible sur ARC et sur l’alignement DMARC via SPF.
text # Postfix: run content filters (disclaimers, antivirus) BEFORE the DKIM signing milter smtpd_milters = inet:127.0.0.1:10025, inet:127.0.0.1:8891 # ^ disclaimer milter ^ OpenDKIM (signs last)
Erreurs associées
dkim=fail reason="signature verification failed"OpenDKIM (Authentication-Results header added by the opendkim milter); mailauth reports the same as "bad signature"dkim=permerrorOpenDKIM (Authentication-Results); mailauth reports syntax errors as dkim=neutraldkim=fail reason="key not found in DNS"OpenDKIM (Authentication-Results); mailauth reports it as dkim=neutral (no key)