DKIM oder auch DomainKeys genannt, ist ein Verfahren um die Authentizität von E-Mails festzustellen. Die grundlegende Funktionsweise ist dabei recht einfach erklärt:
Der sendende Mailserver berechnet einen Hashwert für jede von ihm gesendete Mail und hängt diesen Hash an jede Mail im E-Mail Header an. Der empfangene Mailserver kann die Signatur auswerten und ebenfalls den Hash berechnen. Stimmt der im Mail Header angegebene Hash mit dem berechnetem Hash überein, ist sichergestellt, dass die Mail vom E-Mail Servers des Absenders stammt und nicht verändert wurde.
Damit der Hash nicht einfach während der Übertragung der Mail verändert werden kann, wird der Hash vom sendenden Mailserver verschlüsselt und vom empfangenden Mailserver entschlüsselt. Die Verschlüsslung basiert auf asymmetrischer Verschlüsselung und die erforderlichen Schlüssel können einfach selbst erstellt werden. Eine Zertifizierungsstelle wie bei SSL-Zertifikaten benötigt es dazu nicht.
RSA Schlüssel erstellen
Um DKIM nutzen zu können, wird ein privater Schlüssel und ein öffentlicher Schlüssel benötigt. Der öffentliche Schlüssel wird im DNS als TXT-Record veröffentlicht, der private Schlüssel dient zum signieren der Mail. Die entsprechenden Schlüssel können einfach selbst erzeugt werden. Mit dem Programm OpenSSL lässt sich unter Windows (und Linux) die entsprechenden Schlüssel für DKIM ziemlich einfach erstellen.
Für Windows Betriebssysteme wird zunächst OpenSSL benötigt, welches hier runtergeladen werden kann:
OpenSSL kann auf einem beliebigen Rechner installiert werden. In der Standardinstallation wird es unter “C:\Program Files (x86)\OpenSSL” installiert:
Nach der Installation, kann eine Eingabeaufforderung (cmd) mit Administrator Rechten gestartet werden. Mit dem folgenden Befehl muss dann zunächst in das Programverzeichnis von OpenSSL gewechselt werden:
cd "C:\Program Files (x86)\OpenSSL\bin"
Mit dem folgenden Befehl kann jetzt der private Schlüssel erstellt werden:
openssl.exe genrsa -out DKIM_Private_Key.key 2048
Der öffentliche Schlüssel wird dann mit dem folgenden Befehl erzeugt:
openssl.exe rsa -in DKIM_Private_Key.key -out DKIM_Public_Key.public -pubout -outform PEM
Im Verzeichnis liegen nun 2 Dateien, der Öffentliche Schlüssel “DKIM_Public_Key.public” und der private Schlüssel mit dem Namen “DKIM_Private_Key.key”:
Der öffentliche Schlüssel muss nun etwas bearbeitet werden, damit dieser später im DNS veröffentlicht werden kann. Aktuell enthält der Public Key (DKIM_Public_Key.public) mehrere Zeilen:
Die Zeilen mit “—–BEGIN PUBLIC KEY—–“ und “—–END PUBLIC KEY—–“ werden entfernt:
Danach werden die Zeilenumbrüche entfernt, der komplette Schlüssel steht nun in einer Zeile:
Hinweis: Unbedingt darauf achten, dass keine Zeichen des Schlüssels entfernt werden, der Schlüssel ist sonst ungültig.
DNS Eintrag erstellen
Damit DKIM funktioniert, muss ein entsprechender DNS-Eintrag erstellt werden. Es handelt es sich um einen TXT-Eintrag, ähnlich des TXT-Eintrags für SPF.
Der TXT-Record für DKIM wird hier beispielhaft bei dem Hoster Strato gesetzt. Die DNS Einstellungen finden sich im Kundencenter unter dem Punkt “Domainverwaltung”:
Hier können für die jeweilige Domain neue TXT-Records angelegt werden:
DKIM TXT-Records sind nach dem folgenden Schema aufgebaut:
keyselector._domainkey.domain.tld
Der “Keyselector” ist ein frei wählbarer Name um den DKIM Eintrag zu identifizieren. Es können also mehrere DKIM-Einträge existieren. Der Key Selector wird an eine DKIM signierte Mail im Header angegeben, sodass ein empfangender Mailserver daraus den entsprechenden DNS-Record zusammensetzen und abrufen kann.
Für den Wert werden die folgenden Optionen angegeben:
- v=DKIM1 (Die genutzte DKIM Version)
- k=rsa (Angabe des Schlüsseltyps, in diesem Fall “rsa”)
- p=Öffentlicher Schlüssel (Hier wird der zuvor generierte Öffentliche Schlüssel angegeben.
Bei Strato sieht es dann so aus:
Ich habe “dkim1” als Selector gewählt, bei Bedarf kann ich so einfach die Selektoren erhöhen, falls dies nötig sein sollte.
Nachdem der TXT-Eintrag gesetzt wurde, lassen sich die Einstellungen auch direkt überprüfen:
Auf der Webseite kann der Keyselector und die Domain angegeben und geprüft werden:
Die Webseite liefert dann den DNS-Eintrag und das Ergebnis. Hier sieht man, dass aus Selector und Domain der entsprechende DNS Eintrag zusammengesetzt wurde:
Wenn die Prüfung erfolgreich war, kann die Konfiguration der Sophos UTM beginnen.
Konfiguration Sophos UTM
Die Konfiguration der UTM ist schnell erledigt. Die DKIM-Einstellungen finden sich unter dem Punkt “Email Protection” auf dem Reiter “Erweitert”:
Unter dem Punkt “DomainKeys Identified Mail (DKIM)”, wird nun der private Schlüssel (DKIM_Private_Key.key) eingetragen. Der Schlüssel kann komplett übernommen werden. Es ist nicht nötig Passagen zu entfernen.
Im Feld “Schlüsselselektor” wird nun der zuvor vergebene Selector aus dem DNS Eintrag eingetragen, in diesem Fall also “dkim1”. Es handelt sich hier nicht um die Version (v-Option im DNS-Eintrag“), sondern um den frei wählbaren Namen (Selector).
Im Feld DKIM-Domänen werden die Domänen angegeben, für die der DKIM-Header angefügt werden soll. Gibt es mehrere E-Mail Domänen, können hier auch mehrere Domänen angegeben werden. Bei mehreren Domänen muss der DKIM-DNS Eintrag auch für die weiteren Domänen angelegt werden:
Nachdem die Einstellungen übernommen wurden, kann getestet werden.
Test
Ob die DKIM Konfiguration funktioniert, lässt sich einfach testen indem eine E-Mail an die folgende Adresse verschickt wird:
Der Dienst prüft die SPF und DKIM Einstellungen und informiert über das Resultat.
In diesem Fall wird die Mail über einen Exchange Server versendet, Exchange muss die ausgehenden Mails über die Sophos UTM ins Internet leiten, da die DKIM Signatur erst durch die Sophos UTM angehangen wird.
Hinweis: Exchange Server bietet kein Bordmittel für das Hinzufügen der DKIM Signatur.
Nach kurzer Zeit wird ein Authentication Report zurück gesendet. Der Report enthält dann die Ergebnisse:
Wenn in der Antwortmail “DKIM check pass” angezeigt wird, funktionieren die DKIM Einstellungen.
Etwas weiter unten in der Antwortmail findet sich auch der DKIM Header der Original Mail. Hier sieht man die Signatur, welche durch die UTM angehangen wurde:
Die Antwortmail enthält ebenfalls eine DKIM Signatur, welche im Header sichtbar ist:
Hallo zusammen,
ich hole diesen Threat mal hoch weil ich dazu eine grundlegende Frage habe. Wie sieht eine Überprüfung auf der Empfängerseite aus? Muss dafür etwas konfiguriert werden? Alle Informationen die ich bisher gefunden haben beziehen sich auf den Sender (Exchange/Sophos, Provider usw.) Nur weil dort DKIM eingerichtet ist und Emails signiert versendet werden, ist dies doch nur die Hälfte des Weges. Was muss ich ggf. in der Sophos/Exchange (oder bei meinem Email-Client Zuhause) konfigurieren damit eine eintreffende Email mit DKIM Signatur auch geprüft wird? Und wie bekomme ich dies mit?
Kann ich davon ausgehen (wie in diesem Beispiel), dass wenn DKIM in der Sophos korrekt konfiguriert ist (und im DNS) auch eintreffende Emails automatisch überprüft werden?
Oder habe ich da einen Denkfehler?
Meine einfache Denke ist: Mail-Server/Sophos sendet DKIM signierte Mails an den Empfänger. Der Empfänger (-Mail-Server) kann nun die Signatur mit Hilfe des DNS überprüfen (TXT Record usw.). Kann, muss er doch aber nicht, oder? Wo ist dies Konfiguriert?
Der Empfänger kann ja nur überprüfen wenn eine Mail auch DKIM signiert ist. Keine Signatur, keine Überprüfung, oder?
DKIM ist bei uns auf der Sophos korrekt konfiguriert als auch im DNS. Also versenden wir alle schön Mails mit der Signatur. Ob es etwas bringt, kann ich nicht nachprüfen. Und ich als Empfänger? Ich sitze vor meinem Outlook im Büro und bekomme Emails die mit DKIM signiert sind. Eine Mail, die irgendwie nicht ok ist weil an der Signatur etwas nicht stimmt, habe ich noch nie gesehen. Spam wird in der Sophos mal mehr, mal weniger gut als Spam zurückgehalten. Meist durch RBL’s. Einen Eintrag der irgendwie mit DKIM in Zusammenhang steht kann ich nicht finden.
Somit befürchte ich, ich habe es grundlegend nicht verstanden.
Wer kann mich erhellen?
Gruß
Frank L.
(ein seltener Name )
*PUSH*
Selbe Frage
Ich stelle fest, dass Outlook immer mit der Meldung „The digital signature on this message can’t be verified“ um die Ecke kommt. Ist ja auch klar, die UTM stellt die Signaturen in ihrem Namen aus…..gibt es hier einen Ausweg ?
Hallo Nic,
Die Outlook meldung hat nichts mit DKIM zu tun, sondern mit dem S/MIME Zertifikat, in diesem Fall musst du gültige S/MIME Zertifikate nutzen und nicht die selbst erstellten der UTM.
Gruß,
Frank
@Chris: Danke für den Hinweis zum splitten des DNS Eintrag.
Ich habe es nun mit 2048 hin bekommen.
Der Trick war nun bei SchlundTech einen freien Texteintrag wie folgt einzutragen:
dkim1._domainkey.domain.de. IN TXT („STRING1“ „STRING2″)
Die beiden Strings habe ich wie folgt per Powershell aus der public-Datei erzeugt:
(‚v=DKIM1; k=rsa; p=’+(‚ ‚+(Get-Content .\DKIM_Public_Key.public | Select-Object -Skip 1 | Select-Object -SkipLast 1)).replace(‚ ‚,“)).substring(0,254)
(‚v=DKIM1; k=rsa; p=’+(‚ ‚+(Get-Content .\DKIM_Public_Key.public | Select-Object -Skip 1 | Select-Object -SkipLast 1)).replace(‚ ‚,“)).substring(254)
Kurze Frage, funktioniert das auch wenn die UTM per Smarthost über den Provider sendet???
Hallo Joerg,
ja, allerdings nutzen viele Provider bereits DKIM für die Smarthosts / Relays. Schau dir den Header einer von dir gesendeten Mail vorher einmal an, ggf. findet sich dort schon die DKIM Signatur des Providers (z.B. Strato).
Gruß,
Frank
@Nathan, du kannst den String splitten: https://support.google.com/a/answer/173535?hl=en
Der Domainprovider SchlundTech hat bei Einrichtung des DNS-Eintrag eine Zeichenbegrenzung, daher funktioniert dort nur ein 1024 Schlüssel.
Vielen Dank für die Beschreibung. Leider gibt es DKIM (noch) nicht für die Sophos XG Firewall. Bitte hier voten: https://ideas.sophos.com/forums/330219-xg-firewall/suggestions/17758966-allow-outgoing-emails-to-be-signed-with-dkim
Danke.
Oder man installiert DKIM für MS Exchange:
https://github.com/Pro/dkim-exchange dabei auf die Prioritäten der Transport Agents achten.
Als Tipp für diejenigen, die DKIM im im Office365 / Exchange Online nutzen möchten: Microsoft lässt dort leider keine Einträge per TXT-Record, sondern lediglich per CNAME zu. Ihr solltet euch also einen DNS Provider suchen, welcher Unterstriche in Subdomains erlaubt. Bei Strato war dies bei mir nicht der Fall… (Stand: ca. ~Juni 17.)