Fehlermeldung
dkim=fail reason="signature verification failed"
Auch ausgegeben als
- dkim=fail (bad signature)
OpenDKIM schreibt `dkim=fail reason="signature verification failed"` sowohl bei geänderten Headern als auch bei geändertem Nachrichtentext (reproduziert mit OpenDKIM 2.11.0). mailauth unterscheidet beides: „bad signature“ für die Header, „body hash did not verify“ für den Nachrichtentext.
Was der Fehler bedeutet
Der empfangende Server hat den DKIM-Schlüssel gefunden und die Signatur über die Nachricht in dem Zustand berechnet, in dem sie angekommen ist – und sie stimmte nicht überein: Die signierten Header (bei OpenDKIM auch der Nachrichtentext) haben sich geändert, nachdem der Absender die Nachricht signiert hat, oder der veröffentlichte Schlüssel gehört nicht zum Signaturschlüssel. DKIM signiert exakte Bytes nach der Kanonisierung, deshalb macht jede Änderung durch ein Relay – ein Tag im Betreff, ein Footer, ein neu kodierter MIME-Teil – die Signatur ungültig. Für DMARC zählt das als fehlgeschlagene DKIM-Prüfung.
Warum der Fehler auftritt
Ein Relay hat einen signierten Header geändert
häufigMailinglisten, die dem Betreff ein Tag voranstellen (`[team]`), Gateways, die `From` oder `To` umschreiben, oder Security-Appliances, die `Content-Type` ändern. Jeder in `h=` aufgeführte Header ist mitsigniert.
Footer, Disclaimer oder Umkodierung
häufigAngehängte Disclaimer, umgeschriebene Links, Antivirus-Banner oder die Umwandlung von 8-Bit-Inhalten in Quoted-Printable verändern den Nachrichtentext. Ohne `l=` zählt jedes Byte.
Der Schlüssel im DNS passt nicht zum Signaturschlüssel
gelegentlichNach einer Schlüsselrotation enthält der TXT-Eintrag des Selektors noch den alten öffentlichen Schlüssel, oder zwei Server signieren mit demselben Selektor, aber unterschiedlichen privaten Schlüsseln.
Der Signierer hat die Nachricht nach dem Signieren verändert
gelegentlichSignieren, bevor ein Content-Filter Header hinzufügt oder die Nachricht umschreibt (Milter-Reihenfolge in Postfix), oder eine Bibliothek auf Absenderseite, die signiert und danach die Zeilenenden ändert.
So behebst du den Fehler
- 1.
Signierte Header mit den empfangenen vergleichen
Das Tag `h=` listet auf, was signiert wurde. Vergleiche diese Header in der empfangenen Kopie mit einer Kopie, die beim Absender entnommen wurde (Ordner „Gesendet“).
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.
Für Mailinglisten und Weiterleitungsdienste: ARC und erneutes Signieren
Zwischenstationen, die Nachrichten verändern müssen, sollten ARC-Header hinzufügen und mit ihrer eigenen Domain signieren, damit Empfänger die ursprüngliche Authentifizierung weiterhin auswerten können.
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.
Schlüssel im DNS gegen den privaten Schlüssel prüfen
`opendkim-testkey` bestätigt, dass der veröffentlichte Eintrag für den Selektor zu dem Schlüssel passt, den der Signierer verwendet.
bash opendkim-testkey -d example.com -s sel -k /etc/opendkim/keys/sel.private -vvv # DNS record matches the private key?