Aller au contenu
ecdsa.com
DKIM verifiers (Gmail, mailauth, Rspamd…)DKIM

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

Comment corriger l’erreur

  1. 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. 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

Parcourir toute la base de données des erreurs de signature