TLS-RPT: Şifreli Teslimat Hatalarını Kimse Şikayet Etmeden Görmek
MTA-STS ve DANE politikayı zorlar ama sessizce başarısız olur. TLS-RPT (RFC 8460), alıcı MX'inize yapılan şifreli teslimat denemelerinin gönderen tarafça toplanmış günlük raporudur. Kaydı yayınlamayı, raporları otomatik ayrıştırmayı ve hata tiplerini eyleme çevirmeyi anlatıyoruz.
EvilMail Team19 Temmuz 202612 dk okuma
Bir gönderen, MX'inize STARTTLS ile bağlanamadığında bunu size kimse söylemez. Sertifikanız süresi geçtiğinde, bir ara relay TLS'i strip ettiğinde ya da sunduğunuz zincir eksik olduğunda mektup ya sessizce düz metne düşer ya da — MTA-STS'i enforce moda aldıysanız — gönderenin kuyruğunda çürür. Her iki durumda da sizin logunuzda tek bir satır bile yoktur. Sorunu ilk öğrenme şekliniz genellikle bir müşterinin "size mail atamıyorum" demesi olur.
TLS-RPT (RFC 8460, SMTP TLS Reporting) tam olarak bu kör noktayı kapatır. Alıcı MX'inize yapılan şifreli teslimat denemelerinin sonucunu, gönderen tarafın toplayıp size günlük olarak raporlamasını sağlar. Makine-okunur, toplu (aggregate), gzip'li JSON. Kurulumu beş dakika; değeri, ilk certificate-expired raporunu insanlar şikayet etmeden görmekte.
Bu yazının önerisi net: TLS-RPT'yi MTA-STS'in bir eklentisi olarak değil, kendi başına bir gözlem aracı olarak kurun. Bir politikanız olmasa bile — raporlarda no-policy-found olarak görünür — opportunistic TLS hatalarını size raporlatır. Asıl iş kaydı yayınlamak değil; onlarca gönderenden gelen JSON yığınını sinyale çevirmektir.
TLS-RPT tam olarak neyi görünür kılar
SMTP'de STARTTLS opportunistic'tir: gönderen "TLS varsa kullanırım, yoksa düz metin giderim" der. Bu davranış bir downgrade saldırısına ya da basit bir yanlış yapılandırmaya karşı sizi savunmasız bırakır çünkü düşüş sessizdir. MTA-STS (RFC 8461) ve DANE (RFC 7672) bu sessizliği kırıp "TLS zorunlu" der. Ama zorlama gönderen tarafta olur; teslimat başarısız olduğunda hata gönderenin makinesinde kalır, sizin tarafınıza hiçbir iz düşmez.
TLS-RPT Kaydı Yayınlama ve Şifreli Teslimat Raporlarını Okuma | evilmail.pro — EvilMail Blog
TLS-RPT bu üçlünün geri besleme ayağıdır. Rol dağılımı net:
MTA-STS / DANE — politikayı yayınlar ve zorlar (mekanizma).
Ne olmadığını da baştan söyleyelim: TLS-RPT bir içerik ya da kimlik doğrulama raporu değildir — o iş DMARC'ın. TLS-RPT yalnızca taşıma katmanı, yani SMTP oturumunun TLS'i hakkında konuşur. SPF/DKIM/DMARC ile hiçbir çakışması yoktur, tamamen dik bir eksende çalışır.
DNS kaydını yayınlama
Tek bir TXT kaydı, _smtp._tls alt alanı altında:
dns
_smtp._tls.evilmail.pro. 3600 IN TXT "v=TLSRPTv1; rua=mailto:[email protected]"
Zorunlu iki alan var: v=TLSRPTv1 (kayıtta ilk gelmeli) ve en az bir rua URI'si. rua iki şema kabul eder — mailto: ve https:. Pratikte mailto neredeyse evrensel olarak destekleniyor; https endpoint'ine yalnızca birkaç büyük gönderen (Google evet, çoğu hayır) POST eder. Bir tane seçecekseniz mailto seçin. İkisini birden isterseniz virgülle ayırın:
dns
_smtp._tls.evilmail.pro. 3600 IN TXT "v=TLSRPTv1; rua=mailto:[email protected],https://tlsrpt.evilmail.pro/api/ingest"
İki pratik nokta. Birincisi, raporları toplayan adres için ayrı bir kutu kullanın (tlsrpt@, gerçek posta trafiğinizle karışmasın; parsing tarafında hayatınızı kolaylaştırır). İkincisi — ve DMARC'tan alışkın olanlar için önemli fark — TLS-RPT'te cross-domain doğrulama YOKTUR. rua adresi tamamen başka bir alanda olabilir ve DMARC'taki _report._dmarc benzeri harici yetkilendirme kaydına ihtiyaç duymazsınız. Rapor kutunuzu ayrı bir altyapıda barındırmak istiyorsanız engel yok.
Bu kayıt MTA-STS'ten tamamen bağımsız çalışır, ama ikisini birlikte yayınlamak standarttır. Yayınladıktan sonra doğrulayın:
Raporlar toplu gelir: gönderen başına günde bir kez, UTC 00:00–24:00 penceresi için. İlk raporun düşmesi 24–72 saat sürebilir, o yüzden kaydı yayınlayıp bir gün içinde bir şey gelmedi diye panik yapmayın.
2026 itibarıyla aktif gönderenler: Google Workspace/Gmail, Microsoft (Outlook/Office 365), Yahoo, Comcast, Mimecast. Google hem mailto'ya hem https'e gönderir; gerisi büyük ölçüde mailto.
Biçim, application/tlsrpt+gzip MIME tipiyle gelen gzip'lenmiş bir JSON ekidir (bazı gönderenler application/tlsrpt+json kullanır). Dosya adı konvansiyonu sabittir ve ayrıştırma için bilgi taşır:
Konu satırı da desenlidir: Report Domain: evilmail.pro Submitter: google.com Report-ID: <...>. Bu desen sayesinde raporları bir posta kuralıyla otomatik klasörleyebilirsiniz.
Rapor şemasını satır satır okuma
İçini açalım. Gerçek bir Google raporunun iskeleti şöyle görünür:
Nereye bakacağınız aşağıdaki haritada. Kritik olan üç yer var: policy-type (hangi mekanizmanın raporlandığı), summary (oranı buradan çıkarırsınız) ve failure-details[].result-type (teşhis). sending-mta-ip ve receiving-mx-hostname ikilisi ise "hangi gönderen, sizin hangi MX'inize takıldı" sorusunu cevaplar — bir hatayı kovalarken ilk baktığınız iki alandır.
Elle bakmak için gzip'i açıp jq'ya verin. Dikkat: JSON anahtarları tire içerdiği için jq'da tırnaklamak zorundasınız — tırnaksız .failure-details ifadesi jq tarafından çıkarma işlemi (.failure eksi details) olarak yorumlanır ve boş döner. Önce özet, sonra sadece başarısızlıklar:
Elle gzip açmak bir hafta işe yarar, sonra vazgeçersiniz. Ölçeklenebilir yol adanmış bir posta kutusu artı parsedmarc. parsedmarc DMARC ile tanınır ama SMTP TLS raporlarını da parse eder ve Elasticsearch/OpenSearch'e yazar:
# cron ile 15 dakikada bir
*/15 * * * * /usr/local/bin/parsedmarc -c /etc/parsedmarc.ini
Sonuç smtp_tls index'ine düşer; Kibana veya Grafana'da başarı/başarısızlık oranını gün gün izleyebilirsiniz. Deduplikasyonu report-id üzerinden yapın — aynı rapor bazen tekrar teslim edilir. Saklama için 90 gün fazlasıyla yeterli; asıl değer trend, arşiv değil.
https rua tercih ediyorsanız alım tarafı basittir: gzip'li POST gövdesini açıp JSON'u aynı store'a yazan küçük bir endpoint yeterli. Ama gönderenlerin çoğu https'e göndermeyeceği için tek başına buna güvenmeyin; mailto'yu her zaman tutun.
Hata tiplerini yorumlama ve müdahale
result-type değerleri RFC 8460 §4.3'te tanımlı. Her birinin pratikte ne anlama geldiği ve ne yapacağınız:
`certificate-host-mismatch` — Sunduğunuz sertifikadaki isim MX hostname ile eşleşmiyor. Uzak ara açık farkla en sık gerçek bulgu. Genelde SAN'da MX FQDN'i yok ya da MX'in PTR/HELO adı sertifikayla uymuyor.
`certificate-not-trusted` — Güven zinciri doğrulanamadı, neredeyse her zaman ara sertifika eksik. Let's Encrypt'te cert.pem değil fullchain.pem sunun.
`certificate-expired` — Süresi dolmuş sertifika. Bu derhal müdahaledir: yenileme otomasyonunuz (deploy sonrası postfix reload hook'u) kırık demektir.
`starttls-not-supported` — Alıcı MX STARTTLS anons etmedi ya da downgrade oldu. Genelde eski/geçici bir relay'den gelir.
`validation-failure` — Sınıflandırılamayan genel TLS doğrulama hatası.
`tlsa-invalid` / `dnssec-invalid` / `dane-required` — DANE tarafı. Genelde anahtarı döndürdünüz ama TLSA kaydını güncellemediniz ya da DNSSEC zinciri bozuk.
`sts-policy-fetch-error` / `sts-policy-invalid` / `sts-webpki-invalid` — MTA-STS politika sunucunuz (https://mta-sts.<domain>/.well-known/mta-sts.txt) çekilemiyor, sözdizimi hatalı ya da o sunucunun PKIX sertifikası geçersiz.
Gürültü tabanını gerçek sinyalden ayırmak kritik. Tek bir kötü relay'den gelen bir-üç oturumluk failed-session-count peşinde koşmayın; her ağda bozuk MTA'lar var. Önemli olan oran ve tekrar: total-failure-session-count / total günlük %1'in üstünde ve birden çok gün tekrar ediyorsa gerçek bir sorun var demektir. certificate-expired ise sayı ne olursa olsun istisna — anında bakın.
Raporun işaret ettiği bulguyu MX tarafından teyit edin:
subjectAltName çıktısında MX FQDN'ini görmüyorsanız certificate-host-mismatch'in kaynağını bulmuşsunuz demektir.
Yayına alma kontrol listesi
_smtp._tls.<domain> TXT kaydı yayınlandı, dig +short TXT ile doğrulandı, v=TLSRPTv1 ilk alan.
rua adresi (tlsrpt@) gerçek trafikten ayrı bir kutu; kutu var ve mail alabiliyor.
İlk rapor için 72 saat bekleyin; Google/Microsoft'tan gzip eki geldiğini teyit edin.
parsedmarc save_smtp_tls = True ile cron'da; smtp_tls index'i doluyor, report-id ile dedup çalışıyor.
Grafana/Kibana'da günlük fail-oranı paneli var; %1 üstü tekrar eden orana ve herhangi bir certificate-expired'a alarm bağlı.
MTA-STS ile birlikte yayınlıyorsanız politika sunucunuzun sertifikası ve .well-known/mta-sts.txt erişilebilir — yoksa kendi raporlarınızda sts-policy-fetch-error görürsünüz.
Kaydı yayınlamak beş dakika. Asıl kazanç, bir sonraki sertifika yenileme hook'unuz sessizce kırıldığında bunu bir müşteri değil, sizin Grafana panelinizin söylemesinde.