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)
- Откройте терминал на вашем почтовом сервере.
- Создайте приватный ключ (рекомендуется длина 2048 бит):
openssl genrsa -out dkim_private.key 2048
- Извлеките публичный ключ из приватного:
openssl rsa -in dkim_private.key -pubout -out dkim_public.key
- Посмотрите содержимое публичного ключа — именно это значение (без строк
-----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.
- Сгенерируйте приватный ключ Ed25519:
openssl genpkey -algorithm ed25519 -out dkim_ed25519_private.key
- Извлеките публичный ключ:
openssl pkey -in dkim_ed25519_private.key -pubout -out dkim_ed25519_public.key
- Получите строку для 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-записи.
- Войдите в панель управления DNS у вашего регистратора или хостинг-провайдера.
- Создайте новую 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):
- Установите пакет:
apt install opendkim opendkim-tools - Настройте
/etc/opendkim.conf: укажитеDomain,Selector, путь к приватному ключу и режимCanonicalization relaxed/simple. - В
/etc/postfix/main.cfдобавьте интеграцию через milter:
milter_default_action = accept
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891
- Перезапустите оба сервиса:
systemctl restart opendkim postfix.
Настройка DKIM в MailerQ
MailerQ позволяет задавать DKIM-подпись через Management Console или JSON-конфигурацию. Добавьте ключ и селектор в конфиг домена — подпись будет применяться ко всем исходящим сообщениям для этого домена без перезапуска очередей.
Настройка DKIM через хостинг-панель (без доступа к серверу)
Большинство новых пользователей не имеют прямого доступа к серверу — они работают через cPanel или DirectAdmin. Хорошая новость: в обеих панелях DKIM можно включить за несколько кликов, ключи генерируются автоматически.
Включение DKIM в cPanel
- Войдите в cPanel вашего хостинга.
- Перейдите в раздел Email → Email Deliverability (ранее назывался «Authentication»).
- Выберите нужный домен из списка.
- Если DKIM не активирован, нажмите Enable рядом с пунктом DKIM.
- cPanel автоматически сгенерирует ключ и, если ваши DNS управляются через тот же сервер, опубликует запись самостоятельно. Если DNS внешний — скопируйте предложенное значение TXT-записи и добавьте его вручную у регистратора домена.
Совет. В cPanel перейдите в Email Deliverability → Manage и нажмите Install Suggested Record — панель автоматически добавит оптимальную TXT-запись DKIM в зону домена, если DNS управляется на том же сервере.
Включение DKIM в DirectAdmin
- Войдите в DirectAdmin.
- Перейдите в раздел Email Manager → DKIM Keys.
- Выберите домен из выпадающего списка и нажмите Create DKIM.
- DirectAdmin сгенерирует пару ключей. Публичный ключ отобразится в интерфейсе — скопируйте его для добавления в DNS.
- Если зона DNS управляется через DirectAdmin, запись добавится автоматически. Если DNS внешний — добавьте TXT-запись вида
default._domainkeyсо значением, которое показывает панель.
Настройка DKIM для сторонних сервисов рассылок
Если вы отправляете через ESP (Email Service Provider) — Unisender, SendGrid, Mailchimp и аналоги — ключи генерирует сервис, а вы только добавляете записи в DNS своего домена. Это наиболее распространённый сценарий для маркетологов.
DKIM для Unisender
- В личном кабинете Unisender перейдите в Настройки → Домены отправки.
- Добавьте ваш домен и нажмите Подтвердить.
- Сервис покажет несколько TXT-записей (обычно 2 CNAME и 1 TXT для DMARC). Скопируйте запись DKIM вида
unimail._domainkey.ваш-домен.ruи добавьте её в DNS у регистратора. - После распространения DNS (до 48 часов) нажмите Проверить в интерфейсе Unisender.
DKIM для SendGrid
- Войдите в аккаунт SendGrid, перейдите в Settings → Sender Authentication → Domain Authentication.
- Нажмите Authenticate Your Domain, выберите регистратора и введите домен.
- SendGrid предоставит 3 CNAME-записи (2 для DKIM, 1 для трекинга). Добавьте их в DNS вашего домена.
- Вернитесь в интерфейс SendGrid и нажмите Verify.
DKIM для Mailchimp
- В аккаунте Mailchimp перейдите в Account → Domains и нажмите Start Authentication.
- Введите ваш домен. Mailchimp предоставит 2 CNAME-записи для DKIM.
- Добавьте 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 месяцев. Ротация снижает риски компрометации. Порядок действий:
- Сгенерируйте новую пару ключей с новым селектором (например,
mail2). - Опубликуйте новый публичный ключ в DNS под новым селектором.
- Подождите распространения DNS (минимум 1–2 часа).
- Переключите MTA на новый селектор и приватный ключ.
- Оставьте старую TXT-запись в DNS ещё на 48–72 часа (для писем «в пути»), затем удалите.
Итог: чек-лист настройки DKIM
- Сгенерировать пару RSA-ключей (2048 бит) через OpenSSL — или активировать DKIM через cPanel/DirectAdmin.
- Приватный ключ разместить на сервере, выдать права только MTA-процессу (
chmod 600). - Публичный ключ опубликовать в DNS как TXT-запись
селектор._domainkey.домен. - Настроить MTA (PowerMTA, Postfix + opendkim, MailerQ) на подписание исходящих писем.
- Дождаться распространения DNS и проверить подпись через mail-tester.com или заголовки письма.
- Убедиться, что SPF и DMARC тоже настроены.
- Запланировать ротацию ключей раз в 6–12 месяцев.
- Для сторонних 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 и полную аутентификацию под ключ