Co je DKIM a jak funguje
Co je DKIM
DKIM (DomainKeys Identified Mail) je e-mailový autentizační protokol definovaný v RFC 6376. Umožňuje odesílateli digitálně podepsat e-mail kryptografickým klíčem svázaným s doménou. Příjemce podpis ověří pomocí veřejného klíče publikovaného v DNS — a tím potvrdí, že zpráva skutečně pochází z dané domény a nebyla cestou pozměněna.
Na rozdíl od SPF, které ověřuje pouze oprávněnost odesílajícího serveru, DKIM ověřuje integritu a původ samotné zprávy. DKIM podpis typicky přežívá přeposílání e-mailů (pokud zpráva není cestou pozměněna) — proto je nezbytný pro funkční DMARC nasazení.
Jak DKIM funguje
Celý proces probíhá automaticky a skládá se ze dvou částí: podepisování na straně odesílatele a ověřování na straně příjemce.
Podepisování
- Odesílající mailový server vypočítá hash (otisk) z těla zprávy a vybraných hlaviček (From, To, Subject, Date a dalších).
- Z hashe vytvoří digitální podpis pomocí privátního klíče domény.
- Podpis vloží do hlavičky
DKIM-Signatureodesílaného e-mailu.
Ověřování
- Přijímající server najde v hlavičce
DKIM-Signaturedoménu (d=) a selektor (s=). - Dotáže se DNS na TXT záznam
{selektor}._domainkey.{doména}a získá veřejný klíč. - Veřejným klíčem dešifruje podpis a porovná výsledek s vlastním výpočtem hashe zprávy.
- Pokud se hashe shodují, DKIM kontrola projde (pass) — zpráva je autentická a nebyla pozměněna.
Odesílatel pouze publikuje veřejný klíč v DNS a konfiguruje podepisování na mailovém serveru.
Anatomie DKIM podpisu
Hlavička DKIM-Signature obsahuje několik tagů, které řídí podepisování i ověřování:
DKIM-Signature: v=1; a=rsa-sha256; d=firma.cz; s=mail2024;
c=relaxed/relaxed; q=dns/txt;
h=from:to:subject:date:mime-version:content-type;
bh=2jUSOH9NhtVGCQWNr9BrIAPreKQjO6Sn7XIkfJVOzv8=;
b=AuUoFEfDxTDkHlLXSZEpZj79LICEps6eda7W3deTVFOk4yAUoqOB
Povinné tagy
| Tag | Význam | Příklad |
|---|---|---|
v= |
Verze DKIM (vždy 1) |
v=1 |
a= |
Algoritmus podpisu | rsa-sha256 |
d= |
Podepisující doména | firma.cz |
s= |
Selektor — identifikátor klíče | mail2024 |
h= |
Podepsané hlavičky | from:to:subject:date |
bh= |
Hash těla zprávy (Base64) | 2jUSOH9N... |
b= |
Samotný podpis (Base64) | AuUoFEfD... |
Volitelné tagy
| Tag | Význam | Výchozí hodnota |
|---|---|---|
c= |
Kanonizace (normalizace) hlaviček a těla | simple/simple |
q= |
Metoda dotazu na veřejný klíč | dns/txt |
t= |
Časová značka podpisu (Unix timestamp) | žádná |
x= |
Expirace podpisu (Unix timestamp) | žádná |
l= |
Délka podepsaného těla (v bajtech) — nedoporučuje se používat | celé tělo |
i= |
Identifikátor uživatele nebo agenta (AUID) | @{hodnota d=} |
Kanonizace
Tag c= určuje, jak se zpráva normalizuje před výpočtem hashe. Formát je hlavičky/tělo:
| Režim | Chování |
|---|---|
| simple | Žádná normalizace — přesná shoda |
| relaxed | Toleruje drobné změny (mezery, velikost písmen v hlavičkách) |
Doporučené nastavení je relaxed/relaxed — toleruje běžné úpravy, které provádějí přeposílající servery.
DKIM záznam v DNS
Veřejný klíč se publikuje jako TXT záznam v DNS na adrese {selektor}._domainkey.{doména}:
mail2024._domainkey.firma.cz TXT "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA..."
Tagy DKIM DNS záznamu
| Tag | Význam | Povinný |
|---|---|---|
v= |
Verze (vždy DKIM1) |
doporučený |
k= |
Typ klíče (rsa, ed25519) |
ne (výchozí rsa) |
p= |
Veřejný klíč (Base64) | ano |
t= |
Příznaky (y = testovací režim, s = strict alignment) |
ne |
h= |
Podporované hashovací algoritmy | ne (výchozí: vše povoleno) |
s= |
Typ služby (email, *) |
ne (výchozí *) |
Prázdná hodnota p= signalizuje odvolaný klíč — příjemce podpis s tímto selektorem odmítne.
Selektory a rotace klíčů
Selektor (s=) umožňuje mít pod jednou doménou více DKIM klíčů současně. To je klíčové pro:
- Rotaci klíčů: Vytvoříte nový selektor (
mail2025), nasadíte ho na server a po přechodném období smažete starý DNS záznam (mail2024). - Více odesílacích služeb: Každá služba (mailový server, marketingová platforma, helpdesk) může mít vlastní selektor a klíč.
Doporučená délka RSA klíče je minimálně 2048 bitů. RFC 8301 vyžaduje od odesílatelů minimálně 2048bitové RSA klíče. Klíče o délce 1024 bitů většina ověřovatelů stále přijímá, ale považují se za zastaralé.
Proč DKIM potřebujete
Ochrana integrity zpráv
DKIM je jediný ze tří autentizačních protokolů (SPF, DKIM, DMARC), který ověřuje, že obsah e-mailu nebyl cestou pozměněn. Pokud útočník nebo chybně nakonfigurovaný server změní tělo zprávy nebo podepsané hlavičky, DKIM kontrola selže.
Přežívá přeposílání
SPF kontrola selhává při přeposílání, protože přeposílající server není uveden v SPF záznamu původní domény. DKIM podpis zůstává platný, dokud se nezmění podepsané části zprávy. Proto je DKIM zásadní pro spolehlivou autentizaci v prostředí, kde se e-maily přeposílají.
Základ pro DMARC
DMARC vyžaduje, aby alespoň SPF nebo DKIM prošlo kontrolou a zároveň bylo v alignmentu s doménou v hlavičce From. Díky tomu, že DKIM přežívá přeposílání, je spolehlivějším základem pro DMARC než samotný SPF.
Požadavky velkých poskytovatelů
Od února 2024 Google a Yahoo vyžadují DKIM nebo SPF autentizaci pro všechny odesílatele. Hromadní odesílatelé (nad 5 000 zpráv denně na Gmail) musí mít SPF i DKIM současně plus DMARC záznam.
Jak DKIM nastavit
1. Vygenerujte klíčový pár
Většina e-mailových služeb (Google Workspace, Microsoft 365, marketingové platformy) generuje DKIM klíče automaticky — stačí je aktivovat v administraci a přidat DNS záznam.
Pokud provozujete vlastní mailový server, vygenerujte klíč nástrojem jako OpenSSL nebo OpenDKIM:
openssl genrsa -out dkim-private.pem 2048
openssl rsa -in dkim-private.pem -pubout -out dkim-public.pem
2. Publikujte veřejný klíč v DNS
Přidejte TXT záznam do DNS vaší domény. Název záznamu je {selektor}._domainkey.{doména}:
mail2024._domainkey.firma.cz TXT "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA..."
Veřejný klíč vložte jako Base64 řetězec bez hlaviček PEM souboru.
3. Nakonfigurujte podepisování
Na mailovém serveru nastavte podepisování odchozích zpráv privátním klíčem. Konfigurace závisí na použitém softwaru (Postfix + OpenDKIM, Exim, Exchange).
4. Ověřte funkčnost
Po nasazení si ověřte, že DKIM podepisování funguje. Odešlete testovací e-mail a zkontrolujte hlavičky — hledejte DKIM-Signature v odchozí zprávě a Authentication-Results: dkim=pass v odpovědi.
Ověřte si svůj DKIM záznam naším analyzérem.
Časté problémy s DKIM
Příliš dlouhý klíč pro DNS
DNS TXT záznamy jsou omezeny na 255 znaků na řetězec (omezení protokolu z RFC 1035). Klíč o délce 2048 bitů tento limit překračuje. Řešení: rozdělte hodnotu na více řetězců v uvozovkách — DNS je automaticky spojí:
mail2024._domainkey.firma.cz TXT ("v=DKIM1; k=rsa; "
"p=MIIBIjANBgkqhkiG9w0BAQE..."
"...FAAOCAQ8AMIIBCgKCAQEA...")
DKIM fail po úpravě zprávy
Antispamové filtry, mailing listy nebo podpisové služby mohou modifikovat tělo zprávy. Pokud se změní podepsaná část, DKIM kontrola selže. Řešení:
- Používejte kanonizaci
relaxed/relaxed - U mailing listů pomáhá protokol ARC (Authenticated Received Chain)
Chybějící nebo nesprávný DNS záznam
Pokud DNS záznam se selektorem neexistuje nebo obsahuje syntaktickou chybu, ověření selže s výsledkem permerror nebo temperror. Vždy po přidání záznamu počkejte na propagaci DNS (obvykle do 1 hodiny, maximálně 48 hodin dle TTL) a ověřte záznam DNS nástrojem.
Expirace podpisu
Pokud používáte tag x= (expirace), podpis po uplynutí doby přestane být platný. U zpráv s dlouhým doručením (graylisting, fronty) to může způsobit selhání. Většina konfigurací tag x= nepoužívá.
DKIM v kontextu e-mailové autentizace
DKIM spolupracuje s dalšími protokoly v rámci kompletního zabezpečení e-mailu:
| Protokol | Co ověřuje | Vztah k DKIM |
|---|---|---|
| SPF | Oprávněnost odesílajícího serveru | Komplementární — ověřuje server, ne obsah |
| DMARC | Alignment + politika + reporting | Využívá výsledek DKIM kontroly |
| ARC | Řetězení autentizace při přeposílání | Zachovává DKIM výsledky přes prostředníky |
| BIMI | Vizuální ověření odesílatele | Vyžaduje funkční DMARC (a tím i DKIM) |
Kompletní ochrana vyžaduje SPF, DKIM i DMARC. Zkontrolujte zabezpečení vaší domény a zjistěte, zda máte všechny tři protokoly správně nakonfigurované.