Zpět na seznam článků RSS

Doménový podpis odchozích mailů (DKIM)

Protokol SMTP navrhli pankáči, pročež nezaruču­je integritu ani věrohod­nost čehokoliv. Jedno z šikov­ných rozšíře­ní, které ověřuje pravost domény odesíla­tele, se jmenuje DKIM. Technicky jde o elektro­nický podpis e-mailu s veřej­ným klíčem umístěným v DNS záznamu. Implemen­tace je snadná, není to zdaleka takové rošambo, jako klasický elektro­nický podpis.

Proč se vůbec obtěžovat?

Jasně, maily fungují i bez toho, ale ty s ověře­ným odesíla­telem a integri­tou obsahu jsou apriori důvěryhod­nější.

Význam ověření může být různě velký. SpamAssas­sin například takový mail odměňuje standar­dně desetin­kou bodu.1 Ne­ní to mnoho, pokud vezmeme v potaz běžně pětibodo­vý práh pro označení mailu za spam. Na druhou stranu se SA soustředí více na obsah než zdroj a způsob doručení ma­ilu.

Označení podepsaného e-mailu v rozhraní služby Gmail

Gmail DKIM dlouhodo­bě používá a pro hromadnou korespon­denci doporuču­je.2 Po­depsané e-maily jsou ve webovém rozhraní viditelně označeny.

Znatelně drakonič­tější přístup pravděpo­dobně zvolí Seznam.cz. Od 1. dubna 2015 bu­dou, soudě podle některých informa­cí, hromadné maily bez DKIM/SPF končit v koši.3

Jak to funguje?

Jedná se o klasic­ké použití asymetric­ké kryptogra­fie s párem klíčů. Privátním šifrova­cím, umístěným na serveru odesíla­tele, a veřejným dešifro­vacím, který je součástí DNS záznamu.

Odesíla­tel vytvoří, zašifruje a připojí otisk e-mailu do něho samotné­ho. Příjemce nahlédne do DNS záznamu, dešifruje pomocí veřejného klíče otisk a ověří jeho shodnost s obsahem e-mailu.

V závis­losti na nastavení tak může DKIM garanto­vat:

DKIM v součas­nosti standar­dně používá šifrovací algorit­mus RSA a hashovací funkci SHA1 nebo SHA256.4

Vytvoření a umístění šifrova­cích klíčů

V případě DKIM nejsou šifrovací klíče zapouzdře­ny do žádných certifi­kátů. To je samozřej­mě na jednu stranu slabina (vyřeši­telná použitím DNSSEC), na stranu druhou značné usnadnění implemen­tace – klíče si můžeme udělat sami a nikomu to nebude va­dit.

Sluníčko­ví nebo pohodlní lidé si mohou nechat klíče někde vygenero­vat5, ti aspoň trochu paranoid­ní raději sáhnou po nástroji typu OpenSSL­.6

openssl genrsa -out dkim.pem 1024
openssl rsa -in dkim.pem -pubout

Předchozí dvojice příkazů vytvoří náhodný 1024-bitový privátní klíč do souboru dkim.pem a z něj pak spočítá a vypíše do konzole veřejný klí­č.

Co se případných klíčů větších než 2048 bitů týče, je zde třeba trochu krotit svou paranoiu – musí se totiž vejít do 512-bajtového DNS UDP packetu­.4

DNS záznam s veřej­ným klíčem

Veřejný klíč se umístí do DNS záznamu typu TXT domény odesíla­tele. Jediný povinný parametr je v tomto případě p, obsahují­cí samotný klíč. Připojení verze v se doporuču­je.4

v=DKIM1;p=MGfA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQ…

Záznam je vždy definován vlastní subdoméně _domain­key, která je uvozena ještě (typicky náhodným) selekto­rem. Ten je pak vždy součástí podpisu zprávy.

gwdr74s6e._domainkey

Relativní zápis …

gwdr74s6e._domainkey.example.com.

… nebo ekvivalen­tní zápis absolutní pro example­.com. Povšimně­te si nezbytné tečky na konci.

PHP třída mailDoma­inSigner7 pro podepiso­vání e-mailů

Samotné podepsání e-mailu už můžeme svěřit do péče nějaké hotové tří­dě.

$privateKey = file_get_contents('dkim.pem');
$signer = new mailDomainSigner($privateKey, 'example.com', 'gwdr74s6e');

echo $signer->sign($message, 'from:to:subject', true, true, true);

Za předpokla­du, že proměnná $message bude obsahovat zdrojový kód e-mailu, vytvoří metoda sign dvojici hlaviček se starším doménovým a moderněj­ším DKIM podpisem.

DKIM-Signature: v=1; a=rsa-sha1; s=gwdr74s6e; d=example.com; l=48;
  t=1421797935; c=relaxed/relaxed; h=from:to:subject;
  bh=cFcUOdkLbTTWIiPwtxkgq+igOnU=;
  b=g72FAOswbTfBBbA5TaAe1ZuUQF6qZtIFqCWBTT9PQD9WGbcghaZZGvG7W1hk4yXK23CtzJ1I+Xat
  8wS7YGJOzhvDdHivrnb3zArCGkuG0SKrwTn2KvCtlCLHxMKLvNCQwydoFw+GAxiNkZYSrqGTT9P+
  J0COOY3af8WtxadB25s=
DomainKey-Signature: a=rsa-sha1; c=nofws; d=example.com; s=gwdr74s6e;
  h=from:to:subject;
  b=RCfUSChpRCOOkFZKyKdTpUXHDAJEaZ33afOJLVxx5hFd+DH6JJsrvBGqBqDvQj3MBKrjeUsZUqFt
  wpArPJQyzxHESZxDwtQ9E5u1QsQLH/qNxMCIEm4Dk0pbi6urT30Qfi85rsgl9VszO2pG3nOJoDoo
  /e2rusTqqkT+SePQ50o=

Kromě těla e-mailu jsou do otisku zahrnuty hlavičky From, To a Subject. Hlavička From (adresa odesíla­tele) je zahrnuta povinně­.4

Správnost podpisů je vhodné před ostrým použitím prověřit. Zmiňoval jsem Gmail, existuje ale také celá řada online validáto­rů8 nebo služeb.9

Reference

  1. SpamAssas­sin: Tests Performed — spamassas­sin.apache­.org
  2. Gmail: Bulk Senders Guideli­nes — support­.google­.com
  3. Seznam.cz Email zpřísňuje svoji antispa­movou politiku — seznam.sez­namblog­.cz
  4. RFC 6376: DomainKe­ys Identifi­ed Mail (DKIM) Signatu­res — datatrac­ker.iet­f.org
  5. Google: DKIM key generator — goo.gl
  6. OpenSSL Project — www.openssl.org
  7. PHP class for Add DKIM-Signature and DomainKey-Signature on your mail — code.go­ogle.com
  8. dho's On­line DKIM Verifier — 9vx.org
  9. DomainKe­ys, DKIM, SPF, SpamAssas­sin Email Validator — www.brandonchecketts.com

Pokud není uvedeno jinak, podléhá obsah licenci CC BY-NC-ND a ukázkové zdrojové kódy CC BY.
Martin Hozík — , poslední úprava .