DKIM (DomainKeys Identified Mail) — криптографическая подпись, которую почтовый сервер ставит на каждое исходящее письмо. Принимающая сторона сверяет подпись с публичным ключом из DNS и убеждается, что письмо действительно отправлено с вашего домена и не было изменено в пути. Без DKIM массовая почта в инбокс практически не попадает: Gmail, Mail.ru и Yahoo используют эту проверку при каждом входящем соединении.

Вместе с SPF и DMARC, DKIM формирует тройку DNS-записей аутентификации, без которой говорить о серьёзной доставляемости не приходится. В этой статье — полный путь: от генерации ключей до проверки работающей подписи.

Об авторе. Материал подготовлен командой MailCore System — 10+ лет в email-инфраструктуре, 150+ развёрнутых систем рассылок под ключ, свыше 50 млн писем в месяц через установки MailCore. Статья опирается на RFC 6376 («DomainKeys Identified Mail») и практику реальных производственных инсталляций.

Что такое DKIM и почему это критично для доставляемости

Когда почтовый сервер принимает письмо, он делает запрос в DNS отправителя: «Есть ли там публичный DKIM-ключ для такого-то селектора?» Если ключ найден и подпись сходится — письмо проходит проверку. Если подписи нет вообще или она сломана — письмо получает метку «unauthenticated», что резко снижает шансы на инбокс и ухудшает репутацию домена.

Механизм работает так: при отправке MTA подписывает заголовки и тело письма приватным ключом (хранится на сервере). Публичный ключ публикуется в DNS в виде TXT-записи. Получатель проверяет подпись публичным ключом — и если всё совпало, письмо считается аутентичным. Стандарт описан в RFC 6376.

Практика нашей команды. За 10+ лет работы с email-инфраструктурой мы не видели ни одного случая, когда массовая рассылка без DKIM стабильно попадала бы в инбокс Gmail или Mail.ru. DKIM — это не «желательно», это обязательный минимум вместе с SPF и DMARC.

Из чего состоит DKIM-запись

TXT-запись DKIM публикуется по адресу селектор._domainkey.ваш-домен.ru и содержит несколько тегов:

Тег Значение Обязательность Пример
v Версия стандарта Обязательный v=DKIM1
k Алгоритм ключа Обязательный k=rsa или k=ed25519
p Публичный ключ Base64 Обязательный p=MIIBIjAN...
h Алгоритм хэша Рекомендуется h=sha256
t Флаги (строгий режим) Опциональный t=s
s Тип сервиса Опциональный s=email

Пример готовой записи:

mail._domainkey.example.com. IN TXT "v=DKIM1; k=rsa; p=MIIBIjANBgkq..."

Здесь mail — это селектор. Его выбираете вы сами; можно использовать любое имя: default, s1, smtp1. Один домен может иметь несколько селекторов с разными ключами — это удобно при ротации ключей или нескольких отправляющих серверах.

Шаг 1. Генерация пары ключей

Генерировать ключи можно несколькими способами. Самый распространённый — через OpenSSL на Linux-сервере.

Генерация через OpenSSL (RSA)

  1. Откройте терминал на вашем почтовом сервере.
  2. Создайте приватный ключ (рекомендуется длина 2048 бит):
openssl genrsa -out dkim_private.key 2048
  1. Извлеките публичный ключ из приватного:
openssl rsa -in dkim_private.key -pubout -out dkim_public.key
  1. Посмотрите содержимое публичного ключа — именно это значение (без строк -----BEGIN PUBLIC KEY-----) пойдёт в DNS:
cat dkim_public.key

Скопируйте всё между маркерами начала и конца, удалите переносы строк — получится одна длинная строка Base64 для поля p=.

Практический совет. Используйте ключи длиной 2048 бит. Ключи на 1024 бит считаются слабыми и отклоняются рядом фильтров. Ключи на 4096 бит теоретически надёжнее, но могут не вмещаться в один DNS TXT-ответ и вызывают проблемы с некоторыми резолверами — придётся разбивать запись на части.

Сравнение длин RSA-ключей

Длина ключа Безопасность Совместимость Ограничения DNS Рекомендация
1024 бит Слабая Высокая Нет ❌ Не использовать
2048 бит Достаточная Высокая Нет ✅ Рекомендуется
4096 бит Высокая Средняя Нужно разбивать запись на части ⚠️ Только для особых случаев

Генерация ключа Ed25519 (современный алгоритм)

Ed25519 — эллиптическая криптография, которая даёт короткие ключи (~68 символов в Base64 против ~380 у RSA-2048) при высокой криптографической стойкости. Поддерживается в OpenSSL 1.1.1+ и ряде современных MTA.

  1. Сгенерируйте приватный ключ Ed25519:
openssl genpkey -algorithm ed25519 -out dkim_ed25519_private.key
  1. Извлеките публичный ключ:
openssl pkey -in dkim_ed25519_private.key -pubout -out dkim_ed25519_public.key
  1. Получите строку для DNS (одна строка Base64 без заголовков):
openssl pkey -in dkim_ed25519_private.key -pubout -outform DER | tail -c 32 | base64

Пример DNS-записи для Ed25519:

ed25519._domainkey.example.com. IN TXT "v=DKIM1; k=ed25519; p=11qYAYKxCrfVS/7TyWQHOg7hcvPapiMlrwIaaPcHURo="

Ограничения Ed25519. Не все MTA поддерживают Ed25519: PowerMTA 6.0 поддерживает, Postfix с opendkim — с версии opendkim 2.11+, некоторые устаревшие принимающие серверы (Exchange 2016 и старше) могут не распознавать этот алгоритм. Рекомендуется использовать Ed25519 параллельно с RSA-2048 под разными селекторами — для максимальной совместимости.

Альтернатива: онлайн-генераторы

Существуют веб-сервисы для генерации DKIM-ключей (например, dkimcore.org). Они удобны для быстрого старта, но имейте в виду: приватный ключ должен оставаться только на вашем сервере. Не загружайте чужой приватный ключ в собственную инфраструктуру и не доверяйте ключам из непроверенных источников.

Шаг 2. Публикация публичного ключа в DNS

После генерации публичный ключ нужно разместить в DNS вашего домена в виде TXT-записи.

  1. Войдите в панель управления DNS у вашего регистратора или хостинг-провайдера.
  2. Создайте новую TXT-запись со следующими параметрами:
  • Имя (Host): mail._domainkey (замените mail на ваш селектор)
  • Тип: TXT
  • Значение: v=DKIM1; k=rsa; p=ВАШ_ПУБЛИЧНЫЙ_КЛЮЧ
  • TTL: 3600 (или минимальное значение, доступное у провайдера)

Частая ошибка. Некоторые панели управления DNS автоматически добавляют имя домена к хосту. Если ваш домен — example.com, а поле Host вы заполнили как mail._domainkey.example.com, запись окажется по адресу mail._domainkey.example.com.example.com — что неверно. Вводите только mail._domainkey без домена.

DNS-изменения распространяются от нескольких минут до 48 часов в зависимости от TTL предыдущей записи и провайдера. После публикации переходите к следующему шагу.

Шаг 3. Настройка DKIM-подписи на почтовом сервере

Теперь нужно указать серверу, каким ключом и для каких доменов подписывать исходящую почту. Подход зависит от MTA.

Настройка DKIM в PowerMTA

PowerMTA поддерживает DKIM-подпись нативно. В конфигурационном файле pmta.conf укажите:

<domain example.com>
  dkim-sign yes
  dkim-selector mail
  dkim-private-key /etc/pmta/dkim/dkim_private.key
</domain>

Приватный ключ (dkim_private.key) скопируйте на сервер и установите права доступа, разрешающие чтение только от имени пользователя PowerMTA:

chmod 600 /etc/pmta/dkim/dkim_private.key
chown pmta:pmta /etc/pmta/dkim/dkim_private.key

После изменения конфига перезагрузите PowerMTA командой pmta reload или через веб-консоль, где в реальном времени видны очереди, соединения и состояние каждого vMTA.

Практика нашей команды. При работе с PowerMTA мы всегда привязываем DKIM-ключ к конкретному vMTA — изолированному отправляющему профилю с собственной связкой IP + домен. Это позволяет при компрометации ключа одного профиля не затрагивать остальные потоки отправки.

Настройка DKIM в Postfix с opendkim

Для Postfix чаще всего используют демон opendkim (официальная документация: opendkim.org):

  1. Установите пакет: apt install opendkim opendkim-tools
  2. Настройте /etc/opendkim.conf: укажите Domain, Selector, путь к приватному ключу и режим Canonicalization relaxed/simple.
  3. В /etc/postfix/main.cf добавьте интеграцию через milter:
milter_default_action = accept
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891
  1. Перезапустите оба сервиса: systemctl restart opendkim postfix.

Настройка DKIM в MailerQ

MailerQ позволяет задавать DKIM-подпись через Management Console или JSON-конфигурацию. Добавьте ключ и селектор в конфиг домена — подпись будет применяться ко всем исходящим сообщениям для этого домена без перезапуска очередей.

Настройка DKIM через хостинг-панель (без доступа к серверу)

Большинство новых пользователей не имеют прямого доступа к серверу — они работают через cPanel или DirectAdmin. Хорошая новость: в обеих панелях DKIM можно включить за несколько кликов, ключи генерируются автоматически.

Включение DKIM в cPanel

  1. Войдите в cPanel вашего хостинга.
  2. Перейдите в раздел Email → Email Deliverability (ранее назывался «Authentication»).
  3. Выберите нужный домен из списка.
  4. Если DKIM не активирован, нажмите Enable рядом с пунктом DKIM.
  5. cPanel автоматически сгенерирует ключ и, если ваши DNS управляются через тот же сервер, опубликует запись самостоятельно. Если DNS внешний — скопируйте предложенное значение TXT-записи и добавьте его вручную у регистратора домена.

Совет. В cPanel перейдите в Email Deliverability → Manage и нажмите Install Suggested Record — панель автоматически добавит оптимальную TXT-запись DKIM в зону домена, если DNS управляется на том же сервере.

Включение DKIM в DirectAdmin

  1. Войдите в DirectAdmin.
  2. Перейдите в раздел Email Manager → DKIM Keys.
  3. Выберите домен из выпадающего списка и нажмите Create DKIM.
  4. DirectAdmin сгенерирует пару ключей. Публичный ключ отобразится в интерфейсе — скопируйте его для добавления в DNS.
  5. Если зона DNS управляется через DirectAdmin, запись добавится автоматически. Если DNS внешний — добавьте TXT-запись вида default._domainkey со значением, которое показывает панель.

Настройка DKIM для сторонних сервисов рассылок

Если вы отправляете через ESP (Email Service Provider) — Unisender, SendGrid, Mailchimp и аналоги — ключи генерирует сервис, а вы только добавляете записи в DNS своего домена. Это наиболее распространённый сценарий для маркетологов.

DKIM для Unisender

  1. В личном кабинете Unisender перейдите в Настройки → Домены отправки.
  2. Добавьте ваш домен и нажмите Подтвердить.
  3. Сервис покажет несколько TXT-записей (обычно 2 CNAME и 1 TXT для DMARC). Скопируйте запись DKIM вида unimail._domainkey.ваш-домен.ru и добавьте её в DNS у регистратора.
  4. После распространения DNS (до 48 часов) нажмите Проверить в интерфейсе Unisender.

DKIM для SendGrid

  1. Войдите в аккаунт SendGrid, перейдите в Settings → Sender Authentication → Domain Authentication.
  2. Нажмите Authenticate Your Domain, выберите регистратора и введите домен.
  3. SendGrid предоставит 3 CNAME-записи (2 для DKIM, 1 для трекинга). Добавьте их в DNS вашего домена.
  4. Вернитесь в интерфейс SendGrid и нажмите Verify.

DKIM для Mailchimp

  1. В аккаунте Mailchimp перейдите в Account → Domains и нажмите Start Authentication.
  2. Введите ваш домен. Mailchimp предоставит 2 CNAME-записи для DKIM.
  3. Добавьте CNAME-записи в DNS. После этого нажмите Authenticate Domain в интерфейсе Mailchimp.

Важно. У сторонних ESP записи DKIM чаще всего публикуются как CNAME, а не TXT — это нормально. CNAME указывает на TXT-запись на серверах ESP. Это позволяет провайдеру ротировать ключи без вашего участия.

Шаг 4. Проверка корректности DKIM

После настройки обязательно проверьте, что подпись работает. Есть несколько способов:

Онлайн-инструменты

  • MXToolbox DKIM Lookup — введите домен и селектор, сервис покажет содержимое TXT-записи и укажет на ошибки в синтаксисе.
  • mail-tester.com — отправьте тестовое письмо на выданный адрес, получите балл и детальный разбор: DKIM, SPF, DMARC, спам-фильтры.
  • Google Postmaster Tools — после нескольких дней отправки на Gmail показывает репутацию домена и IP, а также процент писем, прошедших DKIM.

Проверка через заголовки письма

Отправьте тестовое письмо на любой ящик и откройте его заголовки (в Gmail: «Показать оригинал»). Ищите строку вида:

Authentication-Results: mx.google.com;
  dkim=pass header.i=@example.com header.s=mail header.b=AbCdEfGh

Статус dkim=pass означает, что подпись прошла проверку. dkim=fail или dkim=neutral — нужна диагностика.

Частая ошибка. После публикации ключа в DNS проверяют DKIM немедленно и получают ошибку. Причина — TTL: запись ещё не распространилась. Подождите хотя бы 30–60 минут и проверьте снова.

Типичные ошибки при настройке DKIM

  • Несовпадение селектора. В конфиге MTA указан селектор mail, а в DNS опубликован ключ для селектора default. Подпись не пройдёт ни разу.
  • Лишние пробелы и переносы в ключе. При копировании публичного ключа вручную часто попадают символы переноса строки. Ключ в поле p= должен быть одной непрерывной строкой Base64.
  • Неправильные права на приватный ключ. Если MTA не может прочитать файл ключа — подпись не ставится, ошибка уходит в лог без явного предупреждения в очереди.
  • Подписываются не те заголовки. Для максимальной защиты подпись должна покрывать заголовки From, To, Subject, Date, Message-ID. Убедитесь, что конфигурация не исключает критичные поля.
  • Ротация ключей без переходного периода. При смене DKIM-ключа старый ещё какое-то время обрабатывает письма «в пути». Оставляйте старый публичный ключ в DNS минимум 48–72 часа после перехода на новый.
  • Дублирование записи у ESP. При переходе со своего сервера на ESP (или наоборот) нередко в DNS остаются обе DKIM-записи с разными значениями под одним селектором — это вызывает конфликт. Оставляйте только актуальную запись.

DKIM в контексте полной аутентификации: SPF и DMARC

DKIM решает одну задачу — подтверждение подлинности подписи. Но для полной аутентификации нужны ещё две DNS-записи:

  • SPF — перечисляет IP-адреса и серверы, которым разрешено отправлять почту от имени домена. Формат: v=spf1 ip4:1.2.3.4 include:mail.example.com ~all.
  • DMARC — задаёт политику для писем, не прошедших SPF и/или DKIM, и настраивает отправку отчётов об аутентификации.

Примеры DMARC-политик

DMARC-запись публикуется по адресу _dmarc.ваш-домен.ru как TXT. Вот основные варианты:

Политика Что происходит с письмом Когда использовать Пример записи
p=none Доставляется, только мониторинг Начальный этап, сбор отчётов v=DMARC1; p=none; rua=mailto:dmarc@example.com
p=quarantine Отправляется в папку «Спам» После анализа отчётов p=none v=DMARC1; p=quarantine; pct=50; rua=mailto:dmarc@example.com
p=reject Отклоняется сервером получателя Зрелая инфраструктура, нулевой спуфинг v=DMARC1; p=reject; rua=mailto:dmarc@example.com; ruf=mailto:dmarc-fail@example.com

Теги отчётов в DMARC-записи:

  • rua — адрес для агрегированных отчётов (приходят раз в сутки, показывают статистику аутентификации).
  • ruf — адрес для forensic-отчётов (приходят по каждому сбою, содержат заголовки конкретного письма).
  • pct — процент писем, к которым применяется политика (удобно для постепенного ввода quarantine/reject).

Без DMARC ваш домен открыт для спуфинга: злоумышленник может отправить письма «от имени» вашего домена, и получатели не увидят никакого предупреждения. Начинайте с политики p=none для мониторинга, затем — quarantine, и только после анализа отчётов переходите на reject.

Практика нашей команды. При развёртывании инфраструктуры под ключ мы настраиваем SPF, DKIM и DMARC в первый же день — до того как сервер отправит хотя бы одно письмо. Кейс из практики: инфраструктура под 200К писем в день включает DNS/DKIM/DMARC как обязательный пункт на этапе подготовки доменов, ещё до прогрева. Переход к политике p=reject делаем не ранее чем через 2–4 недели после анализа rua-отчётов.

Ротация DKIM-ключей: когда и как менять

Рекомендуемый срок жизни DKIM-ключа — 6–12 месяцев. Ротация снижает риски компрометации. Порядок действий:

  1. Сгенерируйте новую пару ключей с новым селектором (например, mail2).
  2. Опубликуйте новый публичный ключ в DNS под новым селектором.
  3. Подождите распространения DNS (минимум 1–2 часа).
  4. Переключите MTA на новый селектор и приватный ключ.
  5. Оставьте старую TXT-запись в DNS ещё на 48–72 часа (для писем «в пути»), затем удалите.

Итог: чек-лист настройки DKIM

  1. Сгенерировать пару RSA-ключей (2048 бит) через OpenSSL — или активировать DKIM через cPanel/DirectAdmin.
  2. Приватный ключ разместить на сервере, выдать права только MTA-процессу (chmod 600).
  3. Публичный ключ опубликовать в DNS как TXT-запись селектор._domainkey.домен.
  4. Настроить MTA (PowerMTA, Postfix + opendkim, MailerQ) на подписание исходящих писем.
  5. Дождаться распространения DNS и проверить подпись через mail-tester.com или заголовки письма.
  6. Убедиться, что SPF и DMARC тоже настроены.
  7. Запланировать ротацию ключей раз в 6–12 месяцев.
  8. Для сторонних ESP (Unisender, SendGrid, Mailchimp) — добавить CNAME/TXT-записи из личного кабинета сервиса.

DKIM — не разовая задача, а часть постоянного контроля инфраструктуры. Правильная настройка аутентификации в связке с прогревом IP и доменов — основа стабильной доставляемости. Именно так это работает в производственных системах, через которые проходят десятки миллионов писем в месяц.

Часто задаваемые вопросы

Можно ли использовать один DKIM-ключ для нескольких доменов?

Технически нет: DKIM-ключ привязан к конкретному домену. Для каждого домена нужна собственная пара ключей и отдельная TXT-запись в DNS. Использование одного приватного ключа на нескольких доменах технически возможно, но не рекомендуется — компрометация ключа затронет сразу все домены.

Какой размер ключа выбрать: 1024, 2048 или 4096 бит?

Рекомендуется 2048 бит. Ключи на 1024 бит считаются слабыми и могут отклоняться фильтрами. Ключи на 4096 бит надёжнее, но создают проблемы: длинная TXT-запись может не поместиться в один UDP-пакет DNS, что требует разбивки записи на части — это усложняет настройку и может вызвать проблемы у ряда резолверов.

Как долго ждать после публикации DKIM в DNS?

Обычно от 30 минут до нескольких часов. Если у старой записи был высокий TTL, ждать придётся дольше — до 48 часов. Для ускорения установите TTL в значение 300–600 секунд за сутки до обновления записи.

Что делать, если dkim=fail в заголовках письма?

Проверьте три вещи: (1) совпадает ли селектор в конфиге MTA и в DNS; (2) нет ли лишних пробелов или переносов строк в публичном ключе в DNS; (3) есть ли у MTA права на чтение приватного ключа. Большинство ошибок укладываются в эти три причины.

Нужен ли DKIM, если я отправляю небольшие объёмы?

Да. DKIM проверяется независимо от объёма рассылки — Gmail и Mail.ru применяют его для каждого входящего письма. Без DKIM даже небольшая легальная рассылка будет систематически попадать в спам или блокироваться.

Как настроить DKIM в PowerMTA?

В конфигурации pmta.conf добавьте блок domain с параметрами dkim-sign yes, dkim-selector (имя вашего селектора) и dkim-private-key (путь к приватному ключу). Установите права 600 на файл ключа и перезагрузите конфигурацию командой pmta reload.

Чем Ed25519 отличается от RSA для DKIM?

Ed25519 — современный алгоритм на основе эллиптической криптографии: ключи значительно короче (~68 символов против ~380 у RSA-2048), что упрощает DNS-записи. Криптографическая стойкость Ed25519 сопоставима с RSA-3072. Главное ограничение — не все MTA и принимающие серверы поддерживают Ed25519, поэтому его рекомендуется использовать параллельно с RSA-2048 под отдельным селектором.

Как добавить DKIM для Unisender или SendGrid?

Для сторонних сервисов рассылок (Unisender, SendGrid, Mailchimp) ключи генерирует сам сервис. Вам нужно только добавить предоставленные CNAME или TXT-записи в DNS вашего домена. Инструкции находятся в разделе «Домены» или «Аутентификация» личного кабинета ESP. После добавления записей нажмите «Проверить» в интерфейсе сервиса.

Как включить DKIM через cPanel без доступа к серверу?

Зайдите в cPanel → Email → Email Deliverability, выберите домен и нажмите Enable рядом с DKIM. Если DNS управляется на том же сервере — запись добавится автоматически. Если DNS внешний — скопируйте предложенную TXT-запись и добавьте её у регистратора домена в зону вида mail._domainkey.ваш-домен.

Настроить DKIM и полную аутентификацию под ключ

Узнать больше →