Почта держится на аутентификации уже два десятилетия, и только что вышел её самый большой апдейт. Два стандарта опубликованы одновременно: DKIM2 (пока на стадии черновика draft-04) и DMARCbis (оформился в три RFC: 9989, 9990 и 9991).
Старая подпись DKIM работала просто: домен подписывал содержимое письма приватным ключом, ресивер проверял подпись через DNS. Проблема в том, что подпись была привязана только к контенту, а не к пути письма. Поэтому пересылка ломала подпись (список дописал тему — подпись упала), а одно перехваченное письмо можно было воспроизвести миллионам адресатов. ARC пытался это починить, но он лишь записывал наблюдения, а не изменения, и требовал от ресивера доверять репутации каждого промежуточного сервера. Такой инфраструктуры не построили, и IETF сейчас переводит ARC в статус Historic.
DKIM2 решает всё это одной связкой. Подпись перестаёт быть одинокой меткой на контенте и становится звеном в цепочке передачи. Вводится два заголовка: Message-Instance (описывает версию письма в данный момент) и DKIM2-Signature (подписывает конверт — MAIL FROM и RCPT TO каждого прыжка). Пока письмо идёт, каждый хоп добавляет свою подпись, формируя цепочку. Если хоп меняет содержание (например, дописывает футер), он записывает рецепт — компактный JSON, который говорит, как откатить это изменение. Ресивер может отменить правки и перепроверить исходную подпись отправителя. Повторная рассылка одного письма разным адресатам провалится, потому что rt= не совпадёт. Бансы (DSN) тоже чинятся: обратный адрес берётся из подписанного mf= последнего прыжка, а не из поддельного Return-Path. Подписанный банс можно проверить и доказать, что настоящий.
DMARCbis — это не революция, а перекладка труб. Он не меняет суть (привязка аутентификации к видимому домену From:), но чинит конкретные болячки. Главное — уходит статический Public Suffix List (файл волонтёров, лежащий на критическом пути глобальной почты). Вместо него вводится DNS tree walk: ресивер делает живые запросы к DNS, поднимаясь от домена к родителю, пока не найдёт применимый DMARC-запись. Потолок — восемь запросов, так что для коротких имён всё дешёво. Тег pct удалён (он работал только как 0 или 100), его заменил честный флаг t=y, который смягчает политику, но не отключает отчёты. Добавлен np — отдельная политика для несуществующих поддоменов (NXDOMAIN). Добавлен psd — для публичных суффиксов (вроде gov.uk). Спорный момент: p=reject теперь не безусловная команда на баунс. Ресиверу сказано взвешивать улики, а не слепо банить, отправителям — не публиковать p=reject, если пользователи пишут в рассылки.
Первый почтовый сервер, где всё это работает — Stalwart v0.16.12. Поиграться можно в браузере на playground, устанавливать ничего не надо.