← На главную

HMTP: почтовый протокол поверх HTTP с end-to-end шифрованием и Ed25519

27.07.2026 08:27 · hackernews

Энтузиаст предлагает собрать преемника email поверх HTTP — не для замены текущей почты, а как эксперимент и возможность переизобрести каждый элемент, который SMTP тащит 40 лет. Адреса остаются в виде user@domain, всё остальное выбрасывается. Стек — только готовые и проверенные вещи: HTTP, TLS, WebFinger, ActivityPub, Webmention, Ed25519, HPKE, sigchains, JMAP, SSE/WebPush. Протокол закономерно назван HMTP (Hypertext Mail Transfer Protocol).

Обнаружение пользователя идёт через статический JSON-документ по пути /.well-known/hmtp/имя, где лежат inbox и ключи. Это полный аналог MX-записи, но без DNS и с делегированием на уровне отдельных почтовых ящиков. Идентичность не держится на одном ключе, а опирается на цепочку подписей (sigchain) — каждый следующий ключ заверен предыдущим. При потере ключа без подписанной ротации домен может объявить новый ключ с 30‑дневным предупредительным периодом. Правда, домен арендуется, и его перехват даст злоумышленнику вашу почту — эту проблему в ATProto решают через DIDs.

Доставка реализована как POST в inbox получателя. Клиент не ходит напрямую, а шлёт подписанное сообщение в свой аутбокс, и уже сервер отправителя ставит его в очередь, повторяет с экспоненциальной задержкой и уважает заголовок Retry-After. Каждое сообщение несёт id — хеш контента, поэтому повторные попытки идемпотентны, и классические дубликаты исчезают. Сообщение подписывается Ed25519, тело шифруется через HPKE для end-to-end. Принимающий сервер забирает открытый ключ с /.well-known домена отправителя и проверяет подпись — никакого DKIM. Поле in_reply_to содержит хеш родительского сообщения, и треды восстанавливаются без эвристик. Вложения хранятся как ссылки с хешем и скачиваются по требованию.

Антиспам строится слоями. Привязка к домену даёт ненулевую стоимость создания идентичности. Незнакомцы попадают не в основной ящик, а в папку «запросы» — как сообщения от незнакомцев в Signal. При желании сервер может ответить на первый контакт кодом 402 Payment Required. Чтение, синхронизация и поиск стандартизированы через JMAP, push идёт через SSE или WebPush — весь цикл живёт на чистом HTTP за обычным Nginx.

Рабочий прототип на Python выложен на github.com/tanrax/hmtp в одном файле. Он покрывает полный транспорт: подпись, верификацию у источника, end-to-end шифрование, согласие первого контакта, дедупликацию, треды и очередь с экспоненциальной задержкой. Ротация ключей делается одной командой. За кадром оставлены цепочка подписанных ротаций, платежи через 402, вложения по ссылкам и JMAP-чтение. Автор предупреждает: это дизайнерский эксперимент с неаудированной криптографией, не стоит доверять ему настоящие секреты, но как легковесная система для своих экосистем он вполне годится.

Читать оригинал →