How DKIM works
Come funziona DKIM
Premessa
Questa pagina ha una impostazione tecnica. Si dà per scontata la conoscenza delle reti TCP/IP, di come funziona un DNS, l'autonomia nell'usare gli strumenti di configurazione relativi e una minima familiarità con la documentazione IETF.
Considerazioni di base
Oggetto del controllo
Vengono verificate, tramite crittografia a chiave pubblica l'hash del corpo del messaggio e il contenuto di uno o più header specificati dal signer (mittente) secondo l'algoritmo RSA/SHA-256. La firma viene inserita nell'header DKIM-Signature:
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.ch; s=s31663417; t=1705254432; x=1705859232; i=carini@gmx.ch; bh=q/291fcgQWfpN7hvA8L3yIBFvy2ikpy/5tchjtI00dE=; h=X-UI-Sender-Class:From:To:Subject:Date; b=I+MuEdkjdMoa9Bx3JIp+KpqE4XD+Pl9FfBM90vZsDe+N2gDoEnsQb6CJ/JVxPTng 1z5s2NR5uj7/UCC0+uBazEWygr2iiHhvq5X9l0hlo27wFkdCgYYbv13iMc8zgV8EM LBaQSaMe/NMdIa1ZwfFwA2ln39GHeWzNhBnR/wJlSnA1o6HeIc5Oirv1JOH1F0pna hJ0S43n2BSkY0zbOJYwHrq9RuHqypM25dZpurUWZju5nC7yu+WhK+zPvHguLHqPih 158Xo48Dg/z54ENinhrgLyD4Ydr7/kX2TAFGVBANIk9pqH/o3qCT8E5mXXbPPP1lV 5J3LgNGvmrO8RNilcw==
Alcuni esempi di messaggi firmati con DKIM:
- File:Da Infomaniak a Mail-Tester.txt
- File:Da Infomaniak a Gmail.txt
- File:Da Zoho a Mail-Tester.txt
- File:Da GMX a Mail-Tester.txt
Il corpo del messaggio e l'header From:
DEVONO sempre partecipare al processo mentre la scelta di altri header é a discrezione del mittente [1].
[Note: l'hash può essere calcolato a partire solo da una porzione troncata alla dimensione specificata nel tag l]
La chiave pubblica che consente la verifica della firma viene scritta nel record DNS specificato nei tag s=
(selector) e d=
(domain). L'FQDN del record verrà così composto: <s
>._domainkey.
<d
>. Nell'esempio visto sopra la risorsa TXT sarà quindi s31663417._domainkey.gmx.ch
.
Modalità del controllo
Lo schema della verifica di un messaggio può essere semplificato come dal diagramma sottostante:
Il server mittente.com
calcola i tag bh
e h
a come hash di (una parte del) corpo del messaggio e dagli header (fra cui obbligatoriamente il From:
). Il risultato viene firmato con la chiave RSA privata che é memorizzata dentro il server di invio. Il client mittente non ha bisogno e non deve conoscere questa chiave.
Il server destinatario.org
, quando riceve un messaggio recupera la chiave pubblica utilizzando il record slettore e la usa per validare la firma
Esempio pratico
Proviamo a verificare la validità della firma DKIM partendo dalla mail di esempio File:Da GMX a Mail-Tester.txt:
Verifica di bh
Si prende il corpo del messaggio normalizzato con l'algoritmo simple
(c=relaxed/simple;
) [2] che diventa quindi (hex) 00000000 4d 61 69 6c 20 66 72 6f 6d 20 47 4d 58 0d 0a |Mail from GMX..|
e si calcola il bh
come codifica in base64
dell'hash sha256
(a=rsa-sha256
) del corpo del messaggio.
[Note: questo hash NON viene firmato]
host:~> echo -en 'Mail from GMX\r\n' | openssl dgst -sha256 -binary | base64 q/291fcgQWfpN7hvA8L3yIBFvy2ikpy/5tchjtI00dE=
Questo valore viene poi confrontato con il valore del bh
scritto nell'header DKIM-Signature:
, se coincidono si passa a verificare la firma crittografica degli header.
Verifica di b
Per verificare la firma dovremo prima di tutto calcolare l'hash degli header presi nell'ordine h=X-UI-Sender-Class:From:To:Subject:Date;
indicato e normalizzati con l'algoritmo c=relaxed/simple;
come descritto in [3]
Nel nostro messaggio di esempio il risultato della normalizzazione degli header sarà quindi
x-ui-sender-class:724b4f7f-cbec-4199-ad4e-598c01a50d3a\r\n from:Alessandro Carini <carini@gmx.ch>\r\n to:test-tsa0hvorm@srv1.mail-tester.com\r\n subject:DKIM Test\r\n date:Sun, 14 Jan 2024 18:47:12 +0100\r\n dkim-signature:v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.ch; s=s31663417; t=1705254432; x=1705859232; i=carini@gmx.ch; bh=q/291fcgQWfpN7hvA8L3yIBFvy2ikpy/5tchjtI00dE=; h=X-UI-Sender-Class:From:To:Subject:Date; b=
Di questo messaggio viene poi fatto un hash sempre con RSA/SHA-256 la cui firma viene verificata con la chiave pubblica recuperata dal DNS [Note: notare la NON presenza del terminatore CRLF nell'ultima linea] . La verifica pratica, usando OpenSSL viene messa in una pagina a parte: Working DKIM example
Riferimenti esterni
Bibliografia
- La pagina Wikipedia:DomainKeys Identified Mail
- La documentazione ufficiale IETF https://datatracker.ietf.org/doc/html/rfc6376
- "Understanding DKIM" su dmarcian https://dmarcian.com/what-is-dkim/
Link utili
- DKIM Record Checker https://dmarcian.com/dkim-inspector/
- DKIM Record Lookup https://mxtoolbox.com/dkim.aspx