TLS-RPT: как узнать, что ваши письма летят без шифрования
SPF, DKIM, DMARC настроены. Письма доходят. Всё хорошо? Почти. Остаётся вопрос, о котором мало кто задумывается: шифруется ли трафик между серверами? И как узнать, если нет? Для этого существует TLS-RPT - протокол отчётности, который покажет, где шифрование ломается.
Что такое TLS-RPT и зачем он нужен
TLS-RPT (Transport Layer Security Reporting) - механизм, описанный в RFC 8460. Суть простая: принимающие серверы присылают вам отчёты о том, удалось ли установить TLS-соединение при доставке ваших писем. Если сервер получателя попытался использовать STARTTLS, но что-то пошло не так - истёк сертификат, не совпало имя хоста, не поддерживается версия протокола - вы получите отчёт с деталями.
Без TLS-RPT вы слепы. Письма могут передаваться открытым текстом между серверами, и вы об этом не узнаете. Логи отправляющего сервера покажут только свою сторону - что он попытался начать TLS. А что произошло на принимающей стороне? Тишина. TLS-RPT закрывает именно этот пробел.
Особенно важен TLS-RPT в связке с MTA-STS (RFC 8461) - политикой, которая говорит отправляющим серверам: «обязательно используйте TLS при доставке на мой домен, иначе не доставляйте вообще». MTA-STS задаёт правило, TLS-RPT показывает, кто это правило нарушает или не может выполнить. Одно без другого - половина картины.
Как работает: от DNS-записи до JSON-отчёта
Механизм состоит из трёх частей. Первая - DNS-запись, которую вы публикуете. Вторая - отправляющие серверы, которые эту запись читают и знают, куда слать отчёты. Третья - сами отчёты в формате JSON, которые приходят раз в сутки.
Когда сервер Gmail или Outlook отправляет письмо на ваш домен, он проверяет DNS на наличие записи _smtp._tls.yourdomain.com. Если находит - запоминает адрес для отчётов. В конце дня собирает статистику по всем попыткам доставки на ваш домен и отправляет сводный отчёт. Успешные TLS-соединения, неудачные попытки, причины сбоев - всё в одном файле.
Настройка DNS-записи
TLS-RPT настраивается одной TXT-записью в DNS. Формат минимальный - по сути, вы указываете только версию протокола и адрес для получения отчётов.
Отчёты на email
_smtp._tls.yourdomain.com. IN TXT "v=TLSRPTv1; rua=mailto:tlsrpt@yourdomain.com"
Разбор по частям:
_smtp._tls- фиксированный префикс. Именно так, с двумя подчёркиваниями. Не путайте с_dmarc- формат другой.v=TLSRPTv1- версия. Единственная на сегодня.rua=mailto:- адрес для агрегированных отчётов. Работает аналогично rua в DMARC.
Отчёты через HTTPS
Если не хотите засорять почтовый ящик JSON-файлами, можно указать HTTPS-эндпоинт. Отправляющие серверы будут делать POST-запрос с отчётом.
_smtp._tls.yourdomain.com. IN TXT "v=TLSRPTv1; rua=https://tlsrpt.yourdomain.com/report"
Можно указать оба варианта через запятую:
_smtp._tls.yourdomain.com. IN TXT "v=TLSRPTv1; rua=mailto:tlsrpt@yourdomain.com,https://tlsrpt.yourdomain.com/report"
HTTPS-вариант удобнее для автоматизации: эндпоинт принимает JSON, сразу парсит и складывает в базу. Не нужно разбирать MIME-вложения из писем. Но для начала email-вариант проще - не требует инфраструктуры.
Проверка записи
dig TXT _smtp._tls.yourdomain.com +short
Должна вернуться строка, начинающаяся с v=TLSRPTv1. Если пусто - проверьте имя записи (именно _smtp._tls, не _tls._smtp) и дождитесь пропагации DNS.
Структура JSON-отчёта
Отчёт приходит как gzip-архив (при отправке на email) или как JSON-тело POST-запроса (при HTTPS). Внутри - стандартная структура. Вот реалистичный пример отчёта, в котором часть соединений завершилась успешно, а часть - нет:
{
"organization-name": "Google Inc.",
"date-range": {
"start-datetime": "2026-05-14T00:00:00Z",
"end-datetime": "2026-05-14T23:59:59Z"
},
"contact-info": "smtp-tls-reporting@google.com",
"report-id": "2026-05-14T00:00:00Z_yourdomain.com",
"policies": [
{
"policy": {
"policy-type": "sts",
"policy-string": [
"version: STSv1",
"mode: enforce",
"mx: mail.yourdomain.com",
"max_age: 604800"
],
"policy-domain": "yourdomain.com"
},
"summary": {
"total-successful-session-count": 1285,
"total-failure-session-count": 3
},
"failure-details": [
{
"result-type": "certificate-expired",
"sending-mta-ip": "209.85.220.41",
"receiving-mx-hostname": "mail.yourdomain.com",
"receiving-ip": "203.0.113.10",
"failed-session-count": 2
},
{
"result-type": "starttls-not-supported",
"sending-mta-ip": "209.85.220.42",
"receiving-mx-hostname": "backup.yourdomain.com",
"receiving-ip": "203.0.113.11",
"failed-session-count": 1
}
]
}
]
}Разберём ключевые поля:
- organization-name - кто прислал отчёт. Google, Microsoft, Yahoo, Mail.ru - крупные провайдеры поддерживают TLS-RPT.
- policy-type - тип политики. Обычно
sts(MTA-STS) илиno-policy-found, если MTA-STS не настроен. - total-successful-session-count - количество успешных TLS-соединений за период. В идеале это единственное ненулевое число.
- total-failure-session-count - количество неудачных попыток. Любое значение больше нуля - повод разобраться.
- result-type - тип сбоя. Самые частые:
certificate-expired,certificate-host-mismatch,starttls-not-supported,validation-failure.
Типы ошибок и что с ними делать
Каждый result-type указывает на конкретную проблему. Вот полный список из RFC 8460 с переводом на практический язык:
starttls-not-supported. Принимающий сервер не поддерживает STARTTLS. Если это ваш основной MX - срочно включите TLS. Если резервный (backup MX) - он тоже должен поддерживать шифрование. Атакующие знают, что backup-серверы часто настроены небрежнее.
certificate-expired. Самая частая ошибка. Сертификат на MX-сервере просрочен. Решение очевидное: обновить сертификат. Настройте автообновление через Let's Encrypt или аналог. Certbot с cron - минута работы, которая избавит от этой проблемы навсегда.
certificate-host-mismatch. Имя хоста в сертификате не совпадает с MX-записью. Классика: MX указывает на mail.yourdomain.com, а сертификат выдан на yourdomain.com. Добавьте SAN (Subject Alternative Name) или выпустите отдельный сертификат для MX-хоста.
certificate-not-trusted. Сертификат не от доверенного CA. Self-signed сертификаты на продакшен-сервере - это не экономия, это отсутствие шифрования для строгих отправителей.
validation-failure. Общая ошибка валидации TLS. Может быть связана с неподдерживаемой версией протокола (TLS 1.0 и 1.1 уже считаются устаревшими), слабыми шифрами или проблемами с цепочкой сертификатов. Проверьте конфигурацию через openssl s_client -connect mail.yourdomain.com:25 -starttls smtp.
TLS-RPT + MTA-STS: полная картина
TLS-RPT работает и без MTA-STS - вы будете получать отчёты о TLS-сбоях в любом случае. Но максимальный смысл он приобретает именно в связке. MTA-STS говорит отправителям: «Требуйте TLS. Не fallback на plaintext». TLS-RPT показывает: «Вот кто не смог выполнить это требование и почему».
Для настройки MTA-STS нужны два элемента: DNS-запись и файл политики, доступный по HTTPS.
DNS-запись MTA-STS
_mta-sts.yourdomain.com. IN TXT "v=STSv1; id=20260515001"
Поле id - произвольная строка. Меняйте её при каждом обновлении политики - отправляющие серверы кэшируют политику и проверяют id, чтобы понять, нужно ли перечитать файл.
Файл политики
Должен быть доступен по адресу https://mta-sts.yourdomain.com/.well-known/mta-sts.txt. Именно HTTPS, именно этот путь.
version: STSv1 mode: enforce mx: mail.yourdomain.com mx: backup.yourdomain.com max_age: 604800
mode: testing- начните с этого. Отправители будут сообщать о сбоях через TLS-RPT, но не будут блокировать доставку.mode: enforce- после тестирования. Письма без TLS не доставляются.max_age- время кэширования политики в секундах. 604800 = одна неделя. Разумный минимум.
MTA-STS в режиме testing + TLS-RPT - безопасная отправная точка. Вы увидите реальную статистику по TLS-сбоям, ничего не сломав. Через две-три недели чистых отчётов переключайте на enforce.
Мониторинг на практике
Получать отчёты - полдела. Их нужно читать и реагировать. Вот три подхода - от простого к серьёзному.
1. Ручной разбор
Отчёты приходят как gzip-вложения. Распаковываете, смотрите JSON. Для домена с небольшим трафиком (до нескольких тысяч писем в день) этого хватает. Быстро проверить из терминала:
# Распаковать и найти ошибки gunzip -c report.json.gz | python3 -m json.tool | grep -A5 "failure-details" # Или с jq - компактнее gunzip -c report.json.gz | jq '.policies[]."failure-details"[]?'
2. Скрипт-агрегатор
Для доменов с серьёзным объёмом стоит автоматизировать разбор. Простой Python-скрипт, который парсит все отчёты из папки и выводит сводку:
import json, gzip, glob, collections
failures = collections.Counter()
for path in glob.glob("reports/*.json.gz"):
with gzip.open(path, "rt") as f:
report = json.load(f)
for policy in report.get("policies", []):
for detail in policy.get("failure-details", []):
key = detail["result-type"]
count = detail["failed-session-count"]
failures[key] += count
print("TLS failure summary:")
for error, count in failures.most_common():
print(f" {error}: {count}")3. Сторонние сервисы
Если не хотите писать парсеры - есть готовые решения. Report-URI, Postmark, URIports принимают TLS-RPT (и DMARC заодно), парсят, визуализируют и шлют алерты. Указываете их адрес в rua - и дальше смотрите дашборд вместо JSON. Для большинства доменов с умеренным трафиком - оптимальный вариант.
Частые ошибки при настройке
- Перепутан порядок в имени записи. Правильно:
_smtp._tls. Неправильно:_tls._smtp. Ошибка встречается часто, потому что интуитивно кажется, что сначала протокол, потом транспорт. В RFC записано наоборот. - Почтовый ящик для отчётов переполнен. TLS-RPT от крупных провайдеров может генерировать десятки писем в день на загруженном домене. Используйте отдельный ящик или HTTPS-эндпоинт.
- Нет MTA-STS, но ожидают failure-details. Без MTA-STS отчёты будут приходить, но с
policy-type: no-policy-found. Информативность ниже - нет данных о нарушении конкретной политики. - Забыли про backup MX. Основной сервер настроен идеально: свежий сертификат, TLS 1.3, правильные шифры. А backup MX до сих пор на TLS 1.0 с self-signed сертификатом. Когда основной сервер недоступен, письма идут на backup - и TLS-RPT покажет поток ошибок.
- Не обновили id в MTA-STS после смены политики. Отправители кэшируют политику. Если поменяли файл, но не обновили id в DNS - серверы продолжат использовать старую версию до истечения max_age.
Кто отправляет TLS-RPT-отчёты
Не все провайдеры одинаково дисциплинированы. По состоянию на 2026 год: Google присылает отчёты стабильно и подробно. Microsoft (Outlook, Hotmail) - тоже, хотя формат иногда отличается мелочами. Yahoo поддерживает. Mail.ru и Yandex отправляют TLS-RPT, но с меньшей детализацией. Мелкие хостинги и корпоративные серверы - как повезёт.
На практике 80-90% входящего трафика среднего домена идёт от крупных провайдеров. Их отчётов достаточно, чтобы увидеть системные проблемы с TLS.
Чеклист: настройка за 15 минут
- Убедитесь, что на всех MX-серверах (включая backup) установлены валидные TLS-сертификаты. Проверьте:
openssl s_client -connect mail.yourdomain.com:25 -starttls smtp. - Добавьте TLS-RPT DNS-запись:
_smtp._tls.yourdomain.com TXT "v=TLSRPTv1; rua=mailto:tlsrpt@yourdomain.com". - Создайте файл MTA-STS политики на
https://mta-sts.yourdomain.com/.well-known/mta-sts.txtсmode: testing. - Добавьте MTA-STS DNS-запись:
_mta-sts.yourdomain.com TXT "v=STSv1; id=20260515001". - Подождите 24-48 часов. Первые отчёты начнут приходить.
- Проанализируйте failure-details. Исправьте проблемы с сертификатами и конфигурацией TLS.
- Когда failure-count стабильно нулевой - переключите MTA-STS на
mode: enforceи обновите id в DNS.
Зачем вкладываться в TLS-мониторинг
Шифрование email-трафика - не про галочку в чеклисте. Оппортунистический STARTTLS (когда серверы шифруют, если могут, но не настаивают) уязвим к downgrade-атакам. Злоумышленник между вашим сервером и получателем может подавить STARTTLS-объявление, и письмо уйдёт открытым текстом. MTA-STS + TLS-RPT - защита от этого сценария: вы декларируете обязательность шифрования и видите, когда оно не срабатывает.
Для доменов, которые отправляют конфиденциальные данные - финансовые уведомления, медицинскую информацию, юридические документы - это не опция, а необходимость. Регуляторы в ЕС (GDPR) и в России (ФЗ-152) требуют «адекватных мер защиты при передаче персональных данных». TLS-мониторинг - одна из таких мер.
И ещё один аспект: репутация домена. Почтовые провайдеры учитывают использование TLS как сигнал. Google прямо пишет в рекомендациях для отправителей: поддерживайте TLS 1.2+ на принимающих серверах. Это не решающий фактор для доставляемости, но в совокупности с SPF, DKIM, DMARC и чистой базой - формирует полную картину добросовестного отправителя.
Аутентификация без чистой базы - полдела
TLS-RPT, MTA-STS, SPF, DKIM, DMARC - инфраструктурный фундамент. Он защищает канал. Но если в базе мёртвые адреса, спам-ловушки и несуществующие домены - безупречная аутентификация не спасёт от проблем с доставляемостью. Bounce rate растёт, репутация падает, письма уходят в спам.
Настроили TLS-RPT? Следующий шаг - убедиться, что база в порядке. Проверьте список в uChecker - за минуты увидите невалидные адреса, рискованные контакты и потенциальные ловушки.
