DKIM Signatur für E-Mails einrichten

Zum guten Ton beim Versenden von Emails zählt mittlerweile die Signierung via DKIM (DomainKeys Identified Mail). Das Verfahren wurde in Zusammenarbeit einiger großer Namen – darunter auch Microsoft, Cisco und Yahoo – entwickelt und hat sich dabei zu einer Art Standard etabliert.

DKIM ist kein muss, aber ein Meilenstein, wenn man nicht im Spam-Filter der bekannten E-Mail-Provider landen möchte. Der Empfänger hat sogar die Möglichkeit, die Email zu verweigern oder auszusortieren, wenn keine Signatur vorhanden ist oder diese nicht valide ist.

Trotz mittlerweile großer Verbreitung ist es nicht unbedingt trivial, die Signatur in den Email-Versand des eigenen Servers einzubauen. Hier ein kleiner Guide:

Was passiert da überhaupt?

Das Verfahren basiert auf asymmetrischer Verschlüsselung. Unser Server muss also einen öffentlichen Schlüssel bereitstellen und die Emails vor dem Versand mit dem privaten Teil verschlüsseln.

Zuerst wird ein Hash aus Header und Body der Email erzeugt. Dieser wird mit unserem privaten Schlüssel (+ zusätzlich mit Base64) kodiert und als neuer Header hinzugefügt. Der empfangende Server geht dann rückwärts vor: Erst Base64 enkodieren, den erhaltenen Wert mit dem öffentlichen Schlüssel des Servers entschlüsseln und dann selbst den Hashwert der Email ermittel.

Stimmt der entschlüsselte Hash mit dem eigens generierten überein, ist die Signatur valide.

Das Schlüsselpaar erzeugen

Da die Verschlüsselung mit RSA vonstatten geht, könnte man theoretisch das übliche  sh-keygen -t rsa verwenden. Sollte man aber nicht!!! Aus verschiedensten Gründen werden diese Schlüssel nicht akzeptiert. Ein Grund könnte die Schlüssellänge, ein anderer der häufige Beginn der Folge mit „AAA“ (zu linear) sein.

Man verwende hierfür besser  openssl in einem Verzeichnis außerhalb des Projektes:

Mit genrsa wird der private Schlüssel mit einer Länge von 1024 Bit erzeugt. Die 1024 Bit sind relativ sicher und passen gut in einen TXT Record. Mit  rsa wird der öffentliche Schlüssel aus dem privaten erzeugt.

Während der private Key bleiben kann, muss der öffentliche Teil in ein TXT Record auf einer speziellen Subdomain gepresst werden. Lautet der Name meiner Domain „example.com“, muss eine Subdomain „Selektor._domainkey.example.com“ erstellt werden, die einen TXT Record der Form

enthält. Hierbei wird nur der Schlüssel, ohne weitere Informationen wie „ssh-rsa“ oder dem Domainnamen, benötigt. Zum „Selektor“ gleich mehr!

DKIM implementieren (SwiftMailer)

Wie in diesem kleinen Beispiel zu sehen, übernimmt der SwiftMailer die Aufgaben für uns. Alles was wir ihm geben müssen ist der private Schlüssel (mit Kommentarzeilen, so wie er erstellt wurde!), den Domainnamen und einen Selektor.

Der Selektor ist ein beliebiger String, der beim SwiftMailer angegeben und auf dem Server als Subdomain existieren muss! Hierdurch wird er von Empfangs-Server gefunden und identifiziert.

Fehlersuche

In einem unserer Projekte war die Identifizierung kein Problem, aber funktioniert hatte das Verfahren trotzdem nicht. Da DKIM sowohl Header, als auch Body hasht, ist es manchmal wichtig zu überprüfen, was da alles drin steckt…

Wir hatten zusätzliche Header in der Mail angebracht, allerdings erst, nachdem die Signatur schon vollständig erzeugt wurde. Somit hat der Empfangs-Server mit anderen Headern berechnet, als wir…

Statt die Reihenfolge zu ändern, kann man dem Signer aber auch sagen, welche Header-Felder denn konkret beachtet bzw. ignoriert werden sollen.

 

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.