DKIM (DomainKeys Identified Mail, RFC 6376) signiert ausgehende E-Mails kryptografisch. Der empfangende Mailserver prüft die Signatur über einen DNS-Record. Stimmt sie nicht, ist die Mail manipuliert oder stammt nicht vom angegebenen Absender. DKIM ist neben SPF und DMARC einer der drei Bausteine moderner E-Mail-Authentifizierung.

Wie DKIM funktioniert

Der sendende Mailserver berechnet einen Hash über definierte Header-Felder und den Body der E-Mail, verschlüsselt diesen Hash mit seinem privaten Schlüssel und hängt das Ergebnis als DKIM-Signature-Header an die Mail. Der empfangende Server holt den öffentlichen Schlüssel per DNS-Abfrage (selektor._domainkey.domain.de), entschlüsselt die Signatur und vergleicht den Hash. Stimmt er überein, ist die Mail authentisch und unverändert.

DKIM-Schlüssel erstellen

RSA mit 2048 Bit ist der Standard. 1024 Bit gilt seit Jahren als zu schwach, nicht mehr verwenden. Ed25519-Schlüssel sind kompakter und schneller, werden aber noch nicht von allen Empfängern unterstützt. Wer auf Nummer sicher gehen will, signiert mit beiden (Dual Signing).

# RSA 2048 Bit (Standard, universell unterstützt)
openssl genrsa -out /var/db/rspamd/dkim/2026.key 2048
chmod 640 /var/db/rspamd/dkim/2026.key
chown _rspamd:_rspamd /var/db/rspamd/dkim/2026.key

# Öffentlichen Schlüssel extrahieren (für den DNS-Record)
openssl rsa -in /var/db/rspamd/dkim/2026.key -pubout -out /var/db/rspamd/dkim/2026.pub

Der Selektor (hier 2026) ist frei wählbar. Gängige Konvention: Jahr oder Monat als Selektor, das erleichtert die Key-Rotation.

DNS-Record veröffentlichen

Der öffentliche Schlüssel wird als TXT-Record im DNS veröffentlicht. Der Recordname folgt dem Schema selektor._domainkey.domain.de:

2026._domainkey.kernel-error.de. 3600 IN TXT "v=DKIM1; k=rsa; p=MIIBIjANBgkq...langer-Base64-String...IDAQAB"

Den Base64-String aus der .pub-Datei nehmen, ohne Header/Footer-Zeilen und Zeilenumbrüche, alles in eine Zeile. Bei BIND-Zonefiles auf die 255-Zeichen-Grenze pro TXT-String achten. Längere Schlüssel müssen in mehrere Strings aufgeteilt werden (BIND macht das automatisch, wenn man den Record in Anführungszeichen setzt).

rspamd als DKIM-Signer konfigurieren

rspamd bringt DKIM-Signing und -Verification von Haus aus mit, kein zusätzliches Paket nötig. Die DKIM-Signing-Dokumentation beschreibt alle Optionen. Für eine einfache Konfiguration mit einem Schlüssel pro Domain:

# /usr/local/etc/rspamd/local.d/dkim_signing.conf

allow_username_mismatch = true;

domain {
    kernel-error.de {
        path = "/var/db/rspamd/dkim/2026.key";
        selector = "2026";
    }
}

# Nur lokal eingelieferte Mails signieren (SASL-authentifiziert)
sign_authenticated = true;
sign_local = true;

Nach einem service rspamd reload signiert rspamd alle ausgehenden Mails. Die Verification eingehender Mails ist standardmäßig aktiv. Das DKIM-Modul läuft automatisch und fließt in den rspamd-Score ein. Wer rspamd auch für automatisches Spam/Ham-Lernen nutzt, hat damit eine Lösung für beides.

Alternative: opendkim

Wer kein rspamd einsetzt, kann opendkim als Milter in Postfix einbinden. Die Konfiguration ist etwas aufwändiger (eigener Daemon, Socket, Milter-Einbindung in main.cf), funktioniert aber zuverlässig. Die Schlüsselerstellung und DNS-Konfiguration sind identisch.

DKIM testen

Ob der DNS-Record korrekt veröffentlicht ist:

# DNS-Record abfragen
dig TXT 2026._domainkey.kernel-error.de +short

# Mit rspamd testen (wenn lokal installiert)
rspamadm dkim_keygen -d kernel-error.de -s 2026 -k /var/db/rspamd/dkim/2026.key --check

Den einfachsten Funktionstest macht man, indem man eine Mail an eine Adresse bei Gmail oder Outlook schickt und dort die Header prüft. Im Header der empfangenen Mail steht dann:

Authentication-Results: mx.google.com;
    dkim=pass header.d=kernel-error.de header.s=2026

dkim=pass bedeutet: Signatur gültig, Schlüssel im DNS gefunden, Hash stimmt überein.

Key-Rotation

DKIM-Schlüssel sollten regelmäßig getauscht werden. Einmal pro Jahr ist ein guter Rhythmus. Der Ablauf:

  • Neuen Schlüssel mit neuem Selektor erstellen (z.B. 2027)
  • Neuen DNS-Record veröffentlichen
  • rspamd auf den neuen Selektor umstellen
  • Alten DNS-Record noch 30 Tage stehen lassen (für Mails die noch in Queues liegen)
  • Alten Record löschen

Durch die Selektoren können alter und neuer Schlüssel parallel im DNS existieren. Empfänger prüfen immer den Selektor aus dem DKIM-Signature-Header, es gibt keine Unterbrechung.

DKIM allein reicht nicht

DKIM beweist nur, dass eine Mail von einem bestimmten Schlüssel signiert wurde, nicht dass der Absender im From:-Header berechtigt ist, diese Domain zu nutzen. Dafür braucht es die anderen Bausteine:

  • SPF — definiert per DNS, welche IP-Adressen für eine Domain Mails versenden dürfen
  • DMARC — verknüpft SPF und DKIM mit einer Policy: Was soll der Empfänger tun, wenn beides fehlschlägt?
  • DANE/TLSA — sichert den Transportweg per DNSSEC ab

Erst alle drei zusammen (SPF, DKIM und DMARC) ergeben eine vollständige E-Mail-Authentifizierung. Fragen? Einfach melden.