DKIM erläutert an einem konkreten Beispiel.
DomainKeys Identified Mail DKIM ist eine Technologie, die ursprünglich von Yahoo entwickelt wurde. Mit DKIM soll die Reputation einer E-Mail Absenderdomain erhöht werden. DKIM signiert dazu das E-Mail und fügt die Prüfsumme in den Header der E-Mail ein. Der Public Key wird dann als DNS TXT Record in der Absenderdomain hinterlegt. Der Empfänger kann sich diesen Schlüssel einfach über DNS besorgen und die Signatur Überprüfen. Ist die Signatur korrekt, kann der Empfänger davon ausgehen, dass das E-Mail wirklich von dieser Absenderdomain kommt.
Im Gegensatz zum Sender Policy Framework (SPF), bei welchen die erlaubten Absender IP-Adressen im DNS hinterlegt werden, kann der private DKIM Schlüssel auf mehreren Geräten installiert werden. DKIM erlaubt es also, die Reputation von E-Mails zu erhöhen, ohne das der Versand der E-Mails auf einzelne IP Adressen eingeschränkt wird.
Damit DKIM funktioniert müssen mehrere Elemente vorhanden sein.
E-Mail Header: Enthält die Signatur der E-Mail, den verwendeten Signierungsalgorithmus und den Ort, an welchem der Public Key bezogen werden kann. Die Elemente werden in der Form Key=Value hinterlegt.
DNS Selector TXT Record: Ort an dem der Public Key hinterlegt ist.
DNS Policy Record: Angaben, wie DKIM Implementiert ist.
Der MTA welcher ein DKIM signiertes E-Mail erhält interpretiert zuerst den E-Mail Header. Er prüft dann den Policy Record der Domäne und besorgt sich unter dem DNS Selector TXT Record den öffentlichen Schlüssel des Absenders.
Damit kann er die Signatur der E-Mail überprüfen und weiss, ob es sich wirklich um eine Nachricht dieses Absenders handelt.
Am Beispiel von Amazon wird die Funktionsweise der DKIM Signatur genauer erklärt.
Das folgende Listning zeigt ein Ausschnitt aus einem mit DKIM signierten E-Mail.
DKIM-Signature:
v=1;
a=rsa-sha256;
c=relaxed/relaxed;
d=amazon.de;
i=digital-no-reply@amazon.de;
q=dns/txt;
s=amazon201209;
t=1401515577;
x=1433051577;
h=date:from:reply-to:to:message-id:subject:mime-version;
bh=79Y1HKjBx+SfJM6ePcNYyPdW1ZsY+8StC66EffsS9XI=;
b=EOrcD1bA71ngmF7YNKiDqo3IgQwvWpnPR51GTLakL91DcOWp3lxMv8be
OEjtzFfK2G0mWTS1AaxhbtSnn0KWcUAjbiI3OOJP386RiJaeBcdyRM2Nm
XWysEfc7MsWJ4l5cMHaFAxxIDYgFqwKvPrcBk10PU6ZGDYE5lvgSmL7aR
8=;
Der Sender setzt die DKIM Version 1 (v=1) und den Signierungsalgorithmus rsa-sha256 ein. s für Selector bezeichnet den Ort an dem der DKIM Key hinterlegt ist. Im obigen Beispiel bedeutet der Selector s=amazon201209 das der Public Key für diese Nachricht unter amazon201209._domainkey.amazon.com abgerufen werden kann. Der errechnete Body Hash (bh) für die Nachricht ist ebenfalls angegeben.
Der Public Key lautet im Fall von Amazon: p=MIGfMa…..
» dig -t txt amazon201209._domainkey.amazon.com
...
;; QUESTION SECTION:
;amazon201209._domainkey.amazon.com. IN TXT
;; ANSWER SECTION:
amazon201209._domainkey.amazon.com. 658 IN TXT p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDAjRD+MR0FAGIKMgpN6eK/z7Z+ojWuvb3a79qsLS3IU/hdifXxhoi9+ttd4eUBZKfwtSGVg8uOxGFJpPnp4MvZUgb8L6ZCkB/Big6l9JGPNHXCUo4e3RIQJzgWOuqPpO8pS+8HOJiH+fjxGwTZipiK353MlTudq9b6z8Gn8HCXkQIDAQAB\;
Auch im Policy Record wird mit Key und Value Paaren gearbeitet.
» dig -t txt _domainkey.amazon.com
;; QUESTION SECTION:
;_domainkey.amazon.com. IN TXT
;; ANSWER SECTION:
_domainkey.amazon.com. 7200 IN TXT t=y\; o=~\; r=abuse@amazon.com
In diesem Beispiel sind die Keys t, o, und r hinterlegt. Weitere Möglichkeiten sind in RFC6376 Kapitel 3.6.1. Textual Representation beschrieben.
t (Flags): Mit t können Flags hinterlegt werden. y gibt in diesem Fall an, dass DKIM getestet wird. Falls die Signatur dann fehlschlägt hat dies nur einen Soft-Fail zur Folge. Das E-Mail wird dann nicht wegen einer fehlgeschlagenen DKIM Überprüfung verworfen.
o (Outbound Signing Policy): Ein Bindestrich o=- bedeutet, dass alle E-Mails von dieser Domain mit DKIM signiert werden, o=~ bedeutet, dass nur ein Teil der E-Mails mit DKIM signiert wird.
r (Report E-Mail): E-Mail Adresse für Reports Anfragen zur Signing Policy.
Um eine DKIM Signatur manuell zu überprüfen, kann das Python Modul PyDKIM installiert werden. Damit wird ein kleines Skript installiert, welches E-Mails als Standard Input entgegenimmt und die Signatur überprüft.
» cat amazon.eml | dkimverify.py
signature ok
RFC 6376: DomainKeys Identified Mail (DKIM) Signatures http://www.ietf.org/rfc/rfc6376.txt
DKIM Sender Signing Policy draft-allman-dkim-ssp-01 http://tools.ietf.org/html/draft-allman-dkim-ssp-01