Gönderilen bir mail alıcı mailbox’ına ulaşmadan önce bir çok makine üzerinden geçmektedir. Mailin transferi sırasında kurcalanmadan/değiştirilmeden alıcı mailbox’ına ulaştırılması gerekmektedir.
DKIM protokolü burada devreye girmektedir. DKIM protokolü sayesinde mailin transfer esnasında başlıklarının veya içeriğinin değiştirilmediği kontrol edilebilmektedir.
DKIM protokolü mailin doğruluğundan (authenticity) sorumludur.
DKIM Kayıtları
Bir domain birden fazla DKIM public key’ine sahip olabilmektedir. Her bir DKIM key’inin selector’ü bulunmaktadır. Mail doğrulama sırasında mail sunucusu hangi key ile doğrulama yapacağını bilemeyeceği için key’e ait selector ismi ile sorgulama yapmaktadır.
Domain’e ait DKIM selector’ünün adını biliyorsanız terminal üzerinden DNS sorgusu yapabilirsiniz.
$dig selector._domainkey.domain.com TXT
Örnek olarak youtube.com‘un DKIM kaydında 20161025 selector’üne ait public key’i aşağıdaki gibidir.
k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0UfgFQF/Ms63E9cKpj+WdM5RepAYbfAT+h4iAzOb93Q7eVjNd0WabrALPs3qcUEKkrhpI1nlZtOofutG8l4VgslGn7+9ggc489LWyU+u674c3eRoErGOFRq0xV8xnG+RfWKF+im0t4n/QGA2ZcdOIcIfevxyPHudcJipW0G8C6vMtBmQulAfN/SgE1/cugl6VBedZIYuynEF2ttqO9vDLy90/BctMBRJGyyj/CJR7gdLl655Y2+73BFvjhCIWroDrGa2io005Hh1nkReAY9Q2BPQ2K6O7TlIq3SGFVRuPIp0cszwwIjPTy3BP92X2NfiM4CZSPr9R02UfNyPYLQv4wIDAQAB
- v: Versiyon numarası “DKIM1”
- k: Algoritma
- p: Public key’in base64 ile şifrelenmiş hali
Peki bu doğruluğu nasıl sağlıyor?
Mail gönderilirken yapılan işlemler:
- Hangi alanların (hangi header’ların, body’nin) imzalanacağının seçilmesi
- Alanların hash’inin hesaplanması
- Private key ile elde edilen hash’in şifrelenmesi (şifrelenen veriye imza denmektedir.)
- Maile “DKIM-Signature” başlığının ve imzanın eklenmesi
Sırası ile yukarıdaki işlemler yapılarak mail gönderilmeye hazır edilir ve kullanıcıya göndermek üzere iletilir.
Mail alındığında yapılan işlemler:
- Mail içerisindeki “DKIM-Signature” başlığının içerisindeki “s=” parametresi ile belirtilen selector ile DNS isteği yapılır.
- DNS kaydı içerisindeki DKIM public key’i alınır
- Mail’in DKIM-Signature header’ı içerisindeki “h=” parametresi ile belirtilen alanların “a=” parametresi ile belirtilen algoritma ile hash’i hesaplanır
- DKIM-Signature içerisindeki imza DNS sorgusundan elde edilen public key ile decrypt edilir
- Eğer 3. ve 4. adımlardaki hash’ler aynı ise mail’in değiştirilmediği teyit edilir.
Örnek üzerinden gitmeden önce mail’e eklenen “DKIM-Signature” başlığına ufak bir göz atalım. Size gelen maillerin DKIM-Signature gibi başlıklarını görmek için mailin içerisine girdiğinizde “Show Original” ı seçerek mailin orjinal halini görebilirsiniz.
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=spotify.com; h=content-type:from:mime-version:to:subject; s=s1; bh=nyr4MHhVsKUOTaPsPHpMlMo7IIVqvY7xYJnWNsNhAfI=; b=NSiZRJEr0vV59 ran9uvtv6Ldtvl/Wgtm8CfSTCXUjWS23NTbZf/zGKa9myGQiziIpuasrChEMnZ/L ueGFidoY9UDLzSN15oEaPXRGfu7w79u+6aDVeER/PGdt3RBgqC1uBeNH5XXBbjYV JylmhV/iHnJRV14N6L+xLBezQ37LIk=
- v: Versiyon numarası
- a: İmzalamada kullanılan algoritma
- d: Mail’i imzalayan domain
- h: İmzalanmış başlıkların listesi
- s: DKIM selector adı
- bh: Body’e ait hash değeri
- b: İmza (Hesaplanan hash’lerin private key ile şifrelenmiş hali)
DKIM-Signature başlığındaki alanların anlamlarını öğrendiğimize göre şimdi bir örnek ile konuyu pekiştirelim.
Göndericiye ait mail sunucusu imzalamak istediği bölümleri hash’ini alıyor. Örneğin “From, Date, Subject, Message-ID, Content-Type, MIME-Version, X-MS-Exchange-SenderADCheck” alanlarının hash’leri hesaplanır. Hash’leri hesaplanan alanlar mail gönderilirken “DKIM-Signature” header’ının “h” parametresine yazılır.
Daha sonra bu hash’i, domain’ine ait private key (bknz Asymmetric Encryption) ile şifreliyor. Şifrelenmiş bu değeri mailin “DKIM-Signature” header’ının “b” parametresine yazılır.
Mail’in body kısmında da DKIM doğrulama işlemi yapılacaksa, Mail’in body kısmının hash’i alınarak sunucuya ait private key ile şifrelenir ve gönderilecek olan mailin “DKIM-Signature” header’ının “bh” parametresine yazılır.
Mail gönderilmeden önce DKIM-Signature heder son olarak mail şifrelenirken hangi algoritma ile şifrelendiğini “a” parametresine, doğrulama yapılırken hangi selector adı ile sorgu yapılması gerektiğini “s” parametresine, hangi domain’e ait olduğunu “d” parametresine yazılarak mail gönderilir. DKIM-Signature header’ının son hali aşağıdaki gibi olmaktadır.
Mail alıcının mail sunucusuna ulaştığında, DKIM-Signature başlığında “h=” parametresinde belirtilen alanların alanların hash’i “a=” parametresinde belirtilen algoritma ile alınmaktadır.
Mail sunucusu DNS isteği yaparak domain’in DKIM-Signature içerisinde “s=” parametresi ile belirtilen selector’üne ait public key’i öğrenmektedir.
Elde edilen public key ile imzayı decrypt ederek kendi hesapladığı hash değeri ile imzayı decrypt ederek elde ettiği hash değerini karşılaştırarak teyit işlemini gerçekleştiriyor.
Doğrulama başarılı ise mailin transfer sırasında değiştirilmediği anlaşılıyor.
[…] DomainKeys Identified Mail (DKIM) […]