Firma DKIM
Una firma DKIM è una firma crittografica aggiunta alle intestazioni di un'email (l'intestazione DKIM-Signature) che consente ai destinatari di verificare che il messaggio è stato autorizzato dal dominio mittente e non è stato alterato durante il transito. I tag principali includono d (dominio), s (selettore), b (firma) e bh (hash del corpo).
Questa guida fa parte della nostra guida completa a DKIM. Correlati: il record DKIM e perché DKIM fallisce.
Una firma DKIM è una firma crittografica aggiunta alle intestazioni di un’email — trasportata nell’intestazione DKIM-Signature — che consente a un server ricevente di verificare che il messaggio è stato autorizzato dal dominio mittente e non è stato alterato durante il transito. La firma è generata con una chiave privata detenuta dal mittente e controllata rispetto a una chiave pubblica corrispondente pubblicata nel DNS.
Che aspetto ha l’intestazione DKIM-Signature
La firma viaggia come un singolo campo di intestazione anteposto al messaggio. Racchiude tutto ciò di cui un ricevente ha bisogno — il dominio firmatario, il selettore, quali intestazioni sono state firmate, un hash del corpo e la firma stessa — in una serie di coppie tag=value separate da punti e virgola.
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
d=example.com; s=selector1; t=1700000000;
h=from:to:subject:date;
bh=2jUSOH9NhtVGCQWNr9BrIAPreKQjO6Sn7XIkfJVOzv8=;
b=Cg5Xje8kY0m5xT1pW2qL4vN8rH6dF3aZ9cU7bE0iQoR2sT4uV6wX8yZ1
aB3cD5eF7gH9jK2lM4nP6qR8sT0uV2wX4yZ6aB8cD0eF2gH4jK6l=
L’intestazione viene inserita dal server di posta del mittente prima che il messaggio lasci il dominio. Le interruzioni di riga e l’indentazione servono solo per il folding — il valore è logicamente un’unica stringa continua.
I tag in una firma DKIM
Ogni tag porta un pezzo del puzzle della verifica. Il firmatario sceglie questi valori; il verificatore li rilegge per ricostruire e controllare la firma.
| Tag | Nome | Scopo |
|---|---|---|
v | Versione | Versione DKIM. Sempre 1. |
a | Algoritmo | Algoritmo di hash e firma, ad es. rsa-sha256 o ed25519-sha256. |
d | Dominio | Il dominio firmatario — l’identità che DKIM autentica. |
s | Selettore | Indica quale chiave pubblica recuperare dal DNS del dominio. |
h | Intestazioni firmate | Elenco separato da due punti dei campi di intestazione coperti dalla firma. |
bh | Hash del corpo | Hash del corpo del messaggio (canonicalizzato). |
b | Firma | La firma crittografica effettiva, codificata in base64. |
c | Canonicalizzazione | Come le intestazioni/il corpo vengono normalizzati prima dell’hashing, ad es. relaxed/relaxed. |
t / x | Timestamp | t è quando il messaggio è stato firmato; x è quando la firma scade. |
Come funziona la firma (all’invio)
Quando un messaggio lascia il server mittente, DKIM fa due cose. Prima canonicalizza il corpo e ne calcola l’hash, memorizzando il risultato in bh. Poi canonicalizza le intestazioni nominate in h — insieme all’intestazione DKIM-Signature stessa (con un b vuoto) — calcola l’hash di quel blocco e firma l’hash con la chiave privata del dominio. La firma risultante diventa il valore b. Poiché la chiave privata non lascia mai il mittente, solo il vero proprietario del dominio può produrre una firma che verrà convalidata.
Come funziona la verifica (alla ricezione)
Il server ricevente legge l’intestazione DKIM-Signature per apprendere il dominio (d) e il selettore. Interroga il DNS all’indirizzo <selector>._domainkey.<domain> per recuperare la chiave pubblica dal record DKIM. Poi ripete il lavoro del mittente: canonicalizza e calcola l’hash del corpo, lo confronta con bh, canonicalizza e calcola l’hash delle intestazioni firmate e usa la chiave pubblica per controllare b rispetto a quell’hash delle intestazioni. Se sia l’hash del corpo corrisponde sia la firma viene verificata, DKIM supera i controlli. Il controllo bh è ciò che coglie qualsiasi manomissione del corpo del messaggio — anche un solo carattere cambiato produce un hash diverso e fa fallire il controllo.
Quando le firme falliscono
Una firma DKIM fallisce ogni volta che il messaggio che il ricevente vede non corrisponde più a ciò che il mittente ha firmato. Le cause più comuni sono:
- Modifica durante il transito — mailing list, servizi di inoltro e alcuni gateway riscrivono gli oggetti, aggiungono footer o ricodificano il corpo, il che rompe l’hash del corpo.
- Mancata corrispondenza dell’hash del corpo — qualsiasi modifica alla porzione firmata del corpo cambia
bh, quindi la verifica fallisce anche se la chiave è corretta. - Chiave errata o mancante — il selettore punta a un record DNS assente, scaduto o che contiene la chiave pubblica sbagliata.
Per un’analisi più completa delle cause e delle soluzioni, vedi perché DKIM fallisce, e usa lo strumento di lookup DKIM gratuito per confermare che la chiave pubblica di un selettore è pubblicata e ben formata.
Domande frequenti
Cos’è una firma DKIM?
Una firma DKIM è una firma crittografica aggiunta alle intestazioni di un’email nel campo DKIM-Signature. Il mittente la genera con una chiave privata su intestazioni selezionate e un hash del corpo. I destinatari la verificano rispetto a una chiave pubblica nel DNS, dimostrando che il messaggio proviene dal dominio e non è stato alterato.
Cosa significa il tag b= in una firma DKIM?
Il tag b= contiene la firma effettiva: un valore codificato in base64 prodotto firmando un hash delle intestazioni firmate canonicalizzate con la chiave privata del dominio mittente. Il ricevente lo decodifica e lo verifica rispetto alla chiave pubblica recuperata dal DNS. Se le intestazioni firmate sono cambiate durante il transito, il controllo b= fallisce.
Perché una firma DKIM fallisce dopo l’inoltro?
I servizi di inoltro e le mailing list spesso modificano il messaggio — aggiungendo footer, riscrivendo l’oggetto o ricodificando il corpo. Poiché DKIM firma il corpo esatto e le intestazioni selezionate, qualsiasi modifica di questo tipo altera l’hash calcolato così che non corrisponda più all’bh firmato o all’hash delle intestazioni. La firma quindi fallisce la verifica anche se l’originale era valido.
Cos’è l’hash del corpo (bh) in DKIM?
Il tag bh= è un hash del corpo del messaggio dopo la canonicalizzazione, calcolato con l’algoritmo nominato in a. Alla ricezione, il verificatore ricalcola l’hash del corpo e lo confronta con bh. Una mancata corrispondenza significa che il corpo è stato alterato durante il transito, quindi la firma viene rifiutata prima ancora che la firma crittografica in b= venga controllata.