Message d’erreur
dkim=fail reason="signature verification failed"
Également affiché sous la forme
- dkim=fail (bad signature)
OpenDKIM écrit `dkim=fail reason="signature verification failed"` aussi bien pour les modifications des en-têtes que pour celles du corps (reproduit avec OpenDKIM 2.11.0). mailauth les distingue : « bad signature » pour les en-têtes, « body hash did not verify » pour le corps.
Ce que cela signifie
Le serveur destinataire a trouvé la clé DKIM et calculé la signature sur le message tel qu’il est arrivé, et elle ne correspondait pas : les en-têtes signés (ou, pour OpenDKIM, également le corps) ont changé après que l’expéditeur a signé le message, ou bien la clé publiée ne correspond pas à la clé de signature. DKIM signe les octets exacts après canonicalisation : toute réécriture par un relais (une étiquette dans l’objet, un pied de page, une partie MIME réencodée) la casse donc. Pour DMARC, cela compte comme une vérification DKIM échouée.
Pourquoi cela se produit
Un relais a modifié un en-tête signé
fréquenteListes de diffusion qui ajoutent une étiquette dans l’en-tête Subject (`[team]`), passerelles qui réécrivent `From` ou `To`, ou équipements de sécurité qui modifient `Content-Type`. Chaque en-tête listé dans `h=` est couvert par la signature.
Pieds de page, avertissements juridiques ou changement d’encodage
fréquenteLes avertissements juridiques ajoutés, la réécriture des liens, les bannières antivirus ou la conversion du contenu 8 bits en quoted-printable modifient le corps. En l’absence de `l=`, chaque octet compte.
La clé DNS ne correspond pas à la clé de signature
occasionnelleAprès une rotation des clés, l’enregistrement TXT du sélecteur contient encore l’ancienne clé publique, ou bien deux serveurs signent avec le même sélecteur mais avec des clés privées différentes.
Le signataire a modifié le message après l’avoir signé
occasionnelleSignature effectuée avant qu’un filtre de contenu ajoute des en-têtes ou réécrive le message (ordre des milters dans Postfix), ou bibliothèque côté expéditeur qui signe puis modifie les fins de ligne.
Comment corriger l’erreur
- 1.
Comparer les en-têtes signés avec ceux reçus
La balise `h=` liste ce qui a été signé. Comparez ces en-têtes dans la copie reçue avec une copie prise chez l’expéditeur (dossier des messages envoyés).
bash # Which headers did the signature cover, and what do they look like now? grep -i "^DKIM-Signature" -A4 received.eml | grep -o "h=[^;]*" grep -iE "^(From|To|Subject|Date|Message-ID|Content-Type):" received.eml - 2.
Pour les listes et les services de transfert : ARC et nouvelle signature
Les intermédiaires qui doivent modifier les messages devraient ajouter des en-têtes ARC et signer avec leur propre domaine, afin que les destinataires puissent encore évaluer l’authentification d’origine.
text # Mailing list / forwarder: add ARC and re-sign with the list's own domain (Mailman 3 example) [ARC] enabled: yes authserv_id: lists.example.org domain: lists.example.org selector: arc2026 privkey: /etc/mailman3/arc.private - 3.
Vérifier la clé DNS par rapport à la clé privée
`opendkim-testkey` confirme que l’enregistrement publié pour le sélecteur correspond à la clé qu’utilise le signataire.
bash opendkim-testkey -d example.com -s sel -k /etc/opendkim/keys/sel.private -vvv # DNS record matches the private key?