How DKIM works

From Carini MediaWiki
Jump to navigation Jump to search

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:

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

Link utili