Проверка DKIM

Проверка DKIM записи домена так, как её находят принимающие почтовые серверы, или тест подписи вставленного письма: какие селекторы отвечают, кто подписывает, насколько надёжен каждый ключ и выровнен ли он с DMARC.

Источники: 140 распространённых селекторов 67 почтовых провайдеров через Google Public DNS (за ним Cloudflare) · проверки ключей по RFC 6376 и RFC 8301 · письма проверяются в вашем браузере · о вас ничего не сохраняется

Как выполнить проверку DKIM записи домена?

Введите домен выше: проверка запросит 140 селекторов, которыми пользуются почтовые провайдеры, покажет каждый найденный ключ с размером и провайдером и честно скажет, если ничего не нашла. Знаете селектор? Выберите Домен + селектор, и он проверится первым.

Вручную нужен селектор, потому что DNS не умеет их перечислять: dig +short TXT selector._domainkey.example.com, а в Windows nslookup -type=TXT с тем же именем. Селектор — это s= в DKIM-Signature любого письма (RFC 6376 §3.6.2.1).

dig показывает текст, а не его смысл: он не декодирует размер ключа, не идёт по CNAME провайдера и не отличает резервный слот от сломанного. Это и добавляет эта проверка DKIM записи.

dig +short TXT selector._domainkey.example.com

Все TXT-строки по этому имени: склейте их, чтобы прочитать ключ.

Что показывает dig, а что нет

терминал

$ dig +short TXT 20251104._domainkey.google.com 1

"v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQ…" "…k2A8ZfpQIDAQAB"2

$ dig +short TXT 20251104._domainkey.google.com | tr -d '" \n' | sed 's/.*p=//' | base64 -d | openssl pkey -pubin -inform DER -noout -text | head -1 3

Public-Key: (2048 bit)

$ dig +short TXT selector1._domainkey.microsoft.com 4

selector1-microsoft-com._domainkey.microsoft.onmicrosoft.com.

  1. 1Имя — selector._domainkey.domainНет селектора — нет ответа: в DNS нет команды «показать все ключи».
  2. 2Две строки, одна записьВ TXT-строке помещается 255 байт, поэтому ключ на 2048 бит разбит; получатели склеивают строки без разделителей.
  3. 3Реальный размер ключаopenssl декодирует p=: 2048 бит — то, чего просит RFC 8301.
  4. 4CNAME на провайдераЗа ним нет TXT: резервный слот Microsoft 365, а не ошибка.
Ключ google.com и selector1 домена microsoft.com в том виде, как их вернул Cloudflare DNS 25 октября 2026 г..

Как читать результат: перебор селекторов

Сначала идёт ответ одним предложением. Под ним — кто подписывает и сам ключ: каждый тег раскрашен поверх своих символов, а размер ключа показан на шкале RFC 8301; на тёмно-синем — каждый селектор, который запросила проверка, чтобы видно было, что пробовали.

Оценки нет: отозванный ключ или пустой резервный селектор провайдера — это нормально, а «не найдено среди распространённых селекторов» никогда не значит «нет DKIM».

Проверка DKIM для github.com: двенадцать ключей от шести провайдеров, перебор селекторов и шкала размера ключаПроверка DKIM для github.com: двенадцать ключей от шести провайдеров, перебор селекторов и шкала размера ключаВердиктОдно предложение: сколько ключей и что нужно сделать.Кто подписываетОдна карточка на провайдера, найденного по CNAME или документированному селектору. Каждый селектор открывает свой ключ.КлючКаждый тег раскрашен поверх своих символов, а размер ключа показан на шкале RFC 8301.Перебор селекторовКаждое запрошенное имя загорается по мере ответа: зелёный — ключ, жёлтый — 1024 бита, пунктир — резервный слот.Выравнивание DMARCВыравнивается ли ключ с d= этого домена с его политикой DMARC.
Проверка DKIM для github.com: вердикт, кто подписывает, ключ, разобранный на теги, с его размером, и на тёмно-синем каждый селектор, который запросила проверка. Выберите номер, чтобы увидеть, что показывает каждая часть.

Что такое DKIM?

DKIM (DomainKeys Identified Mail) — это подпись, которую отправляющий сервер добавляет к каждому письму, а получатели проверяют открытым ключом, опубликованным доменом в DNS (RFC 6376). Действительная подпись доказывает два факта: домен из d= подписал письмо, и подписанные части с тех пор не менялись.

Отправитель хеширует тело в bh= и подписывает выбранные заголовки вместе с этим хешем своим закрытым ключом в b=. Получатель читает d= и s=, берёт ключ из s._domainkey.d и повторяет обе операции. Один изменённый байт в теле или в подписанном заголовке — и подпись не проходит.

DKIM ничего не говорит о том, что делать при сбое, и подписать может любой домен. Это работа DMARC: он требует действительную подпись, чей d= совпадает с доменом From:.

Одно письмо: подписано у отправителя и проверено у получателя

Сервер example.comподписывает закрытым ключом
письмо вместе с DKIM-Signature
ПолучательGmail, Outlook.com, Yahoo…

DKIM-Signature: v=1; a=rsa-sha256; d=example.com; s=dnsrobot-sample; h=from:from:to:subject:…; bh=fohb/a+auh1W9cUN…; b=fF0aMr3Uo+mbgG…

dnsrobot-sample._domainkey.example.com TXT?"v=DKIM1; k=rsa; p=MIIBIjANBgkq…"RSA 2048

Письмо как отправлено

  • Хеш тела совпадает с bh=
  • Подпись заголовков проверяется

dkim=pass header.d=example.com

То же письмо, у которого по пути изменили Subject

  • Хеш тела совпадает с bh=
  • Подпись заголовков не проверяется

dkim=fail (signature-mismatch)

Оба результата получены нашим движком: для примера письма на этой странице и для того же письма с Subject, изменённым после подписания. RFC 6376 §3.7, RFC 8301.

Что такое селектор DKIM и как найти свой?

Селектор — это имя одного ключа DKIM: s= в подписи и первая метка DNS-имени, по которому лежит ключ (s1._domainkey.github.com). У домена их может быть сколько угодно: по одному на провайдера, на сервер, на год (RFC 6376 §3.1).

Чтобы найти свой, откройте любое письмо, отправленное доменом, и посмотрите оригинал: в Gmail Ещё (⋮) › «Показать оригинал» показывает DKIM-Signature, и её s= — это селектор. Или вставьте письмо в Проверить письмо выше.

Большинство провайдеров используют фиксированные имена, поэтому перебор их находит. Amazon SES, Postmark, SparkPost и HubSpot создают имя для каждого аккаунта, и узнать его можно только из письма или панели провайдера.

От подписи к ключу и имена, которые используют провайдеры

DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=github.com; s=s1; …

s1._domainkey.github.comCNAME s1.domainkey.u51742174.wl175.sendgrid.netRSA 2048

Google Workspacegoogleадминистратор может изменить префикс
Microsoft 365selector1 · selector2CNAME в тенант; один активный, один резервный
Twilio SendGrids1 · s2CNAME на u<id>.wl<n>.sendgrid.net
Mailchimpk2 · k3CNAME на dkim2/dkim3.mcsv.net
Fastmailfm1 · fm2 · fm3три CNAME, заполнен один за раз
Proton Mailprotonmail · 2 · 3CNAME в domains.proton.ch
Amazon SES3 случайных токенапо 32 случайных символа: не угадать
Postmark20240101000000pmдата и «pm»: не угадать
SparkPostscph + MMYYscph и месяц создания ключа
HubSpoths1-<HubID>номер вашего аккаунта
s1 домена github.com в том виде, как его вернул Cloudflare DNS 25 октября 2026 г.. Имена провайдеров — из их собственной документации (67 провайдеров, 140 селекторов в переборе).

Формат записи DKIM: объяснение каждого тега

Запись DKIM — это TXT-запись из пар тег=значение, разделённых точкой с запятой; обязателен только p=, открытый ключ. v=DKIM1 необязателен, но если есть, должен идти первым (RFC 6376 §3.6.1).

k= задаёт тип ключа (rsa, если не указано ed25519), t= несёт флаги (y — тестирование, s — строгий), h= ограничивает хеши, а s= — службы. Пустой p= намеренно отзывает ключ.

Имена тегов чувствительны к регистру, а повторяющийся тег делает запись недействительной. Неизвестные теги игнорируются.

Запись по тегам

v=DKIM1; k=rsa; t=s; h=sha256; p=MIIBIjANBgkqhkiG9w…IDAQAB

ТегЗадаётЗначенияПо умолчаниюПримечание
v=ВерсияDKIM1DKIM1рекомендуется; первый, если есть
k=Тип ключаrsa · ed25519rsaнеизвестные типы: ключ игнорируется
p=Открытый ключ (base64)ключ или пустообязателенпусто = отозван
t=Флагиy тестирование · s строгийнетy: считается неподписанным
h=Допустимые хешиsha256 (sha1 запрещён)всеодин sha1 не проходит (RFC 8301)
s=Тип службы* · email*только другие службы: игнорируется
n=Заметки для людейлюбой текст–программы не читают

Какой длины p= и сколько TXT-строк ему нужно

RSA 1024216 символов · 1 TXT-строка
RSA 2048392 символов · 2 TXT-строки
RSA 3072564 символов · 3 TXT-строки
RSA 4096736 символов · 3 TXT-строки
Ed2551944 символов · 1 TXT-строка

границы TXT-строк по 255 байт (считая «v=DKIM1; k=rsa; p=»)

Длины p= — это измеренные ключи SubjectPublicKeyInfo. yahoo.com публикует свой ключ на 2048 бит в 4 строках: подойдёт любое разбиение, потому что получатели склеивают их без разделителей (RFC 6376 §3.6.2.2).

Ключи DKIM 1024 и 2048 бит и как их менять

Используйте RSA на 2048 бит. RFC 8301 по-прежнему требует от проверяющих принимать ключи в 1024 бита, но просит от подписывающих не менее 2048 и велит проверяющим отвергать ключи короче 1024 бит. M3AAWG называет 1024 бита «на грани взлома» и сообщает, что ключ на 512 бит взломали примерно за 72 часа и примерно за 75 долларов.

Ключ Ed25519 невелик (44 символа p=), и для обратной совместимости RFC 8463 позволяет подписывающим добавить рядом подпись RSA: два селектора, две подписи (RFC 8463).

Меняйте так: опубликуйте новый ключ в новом селекторе, переключите подпись, держите старый ключ от 7 до 30 дней для писем в пути, затем опустошите его p=. M3AAWG советует делать это раз в полгода. Провайдеры вроде Fastmail и Microsoft 365 делают это за вас с помощью резервных селекторов.

Где настоящие ключи лежат на шкале RFC 8301

Не проходитДействителен, перейдите на 2048ХорошоМожет не пройти у части получателей
  • microsoft.com · selector2
  • github.com · k1
  • google.com · 20251104
  • fastmail.com · fm2
  • archlinux.org · dkim-rsa
  • archlinux.org · dkim-ed25519 (Ed25519)

Замена без перерыва (M3AAWG)

  1. День 0Опубликуйте новый ключ в новом селекторе
  2. День 1+Переключите подпись на него
  3. +7–30 днейДержите старый ключ для писем в пути
  4. ЗатемОпустошите старый p=; не используйте имя повторно
fastmail.comfm1пустой p=fm22 048fm3пустой p=три CNAME, заполнен один: ротация — это изменение DNS на стороне Fastmail
Размеры ключей прочитаны из DNS 25 октября 2026 г., декодированы из каждого p=. RFC 8301 §3.2; M3AAWG DKIM Key Rotation Best Common Practices (2019).

Почему DKIM не проходит? Хеш тела, пересылка и рассылки

DKIM не проходит, когда подписанные байты изменились, когда ключ не найден или когда ключ не подходит к подписи. Пересылка, которая не меняет письмо, сохраняет DKIM (в отличие от SPF); рассылки обычно его ломают, потому что добавляют футеры или помечают тему.

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

Хеш тела не совпал

Рассылка добавила футер размером 153 Б. Заголовки по-прежнему проверяются ключом project.example, так что это не подделка.

Что делать Рассылки, которые не меняют тело, или ARC (RFC 8617), чтобы последующие получатели видели исходный результат.

body-hash-mismatch

Подпись не прошла

Подписанный заголовок изменили после подписания (рассылка дописала своё название в Subject) или в селекторе теперь другой ключ.

Что делать Не переписывайте подписанные заголовки; публикуйте новый ключ в новом селекторе, а не заменяйте имеющийся.

signature-mismatch

Нет ключа для подписи

s=2023old._domainkey.shop.example — NXDOMAIN: селектор удалили, пока письма с ним ещё были в пути.

Что делать Держите старые ключи опубликованными 7–30 дней после переключения; опустошайте p=, а не удаляйте.

key-not-found

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

DKIM, SPF и DMARC: в чём разница

SPF говорит, какие серверы могут отправлять почту от имени домена, DKIM доказывает, что домен подписал письмо и оно не менялось, а DMARC привязывает оба к адресу From: и говорит, что делать при сбое.

Они отвечают на разные вопросы, поэтому нужны все три: Gmail и Yahoo требуют от массовых отправителей SPF и DKIM плюс запись DMARC, а RFC 9989 просит домены с p=reject подписывать DKIM, а не полагаться на SPF.

Три записи, три вопроса

Три записи, три вопросаSPFDKIMDMARC
Что доказываетЭтот сервер может отправлять почту от домена MAIL FROMДомен d= подписал; подписанные части не менялисьFrom: совпадает с доменом, прошедшим SPF или DKIM
Где лежитTXT у github.comTXT у s1._domainkey.github.comTXT у _dmarc.github.com
github.com сегодняv=spf1 … ~all12 ключей, 6 провайдеровp=quarantine; sp=reject
Переживает пересылкуНет: IP пересылающего сервера не указанДа, если письмо пришло без измененийДа, благодаря выровненной подписи DKIM
Ломается, когдановый сервис отправки не внесён в записьменяется тело или подписанный заголовокни SPF, ни DKIM не проходят для домена From:
Записи github.com в том виде, как они прочитаны 25 октября 2026 г..

Как прочитать заголовок DKIM-Signature в письме

Откройте исходное письмо и найдите заголовок DKIM-Signature: d= — кто подписал, s= — каким ключом, h= перечисляет подписанные заголовки, а bh= и b= — два хеша, которые проверяет получатель.

Вердикт получателя — отдельный заголовок, добавляемый при получении: Authentication-Results: … dkim=pass header.d=example.com header.s=dnsrobot-sample. Страница «Показать оригинал» в Gmail (на английском) резюмирует его как «DKIM: 'PASS' with domain example.com».

В письме может быть несколько подписей, по одной на каждого подписывающего (ваш домен и ваш почтовый сервис или рассылка). Для DMARC достаточно одной действительной подписи с выровненным d=.

Подпись примера письма по тегам

v=11; a=rsa-sha2562; c=relaxed/relaxed3; d=example.com4; s=dnsrobot-sample5; t=17928331206; h=from:from:to:subject:date:message-id:mim…7; bh=fohb/a+auh1W9c…8; b=fF0aMr3Uo+mbgG…9

  1. 1Версия v=всегда 1
  2. 2Алгоритм a=rsa-sha256 (или ed25519-sha256)
  3. 3Канонизация c=relaxed терпит перенос строк
  4. 4Домен подписи d=сравнивается с From: для DMARC
  5. 5Селектор s=ключ в s._domainkey.d
  6. 6Время подписи t=время Unix: 24 окт. 2026 г., 09:12
  7. 7Подписанные заголовки h=from дважды = повторная подпись
  8. 8Хеш тела bh=SHA-256 канонического тела
  9. 9Подпись b=над заголовками из h= и этим полем

Authentication-Results: mx.example.net; dkim=pass header.d=example.com header.s=dnsrobot-sample

Выдуманное письмо-пример, которое загружает эта страница (example.com, ключ, созданный для него), проверенное движком.

Проверка DKIM: частые вопросы

Что такое запись DKIM?

Запись DKIM — это TXT-запись, которая публикует открытый ключ домена по имени selector._domainkey.domain, например google._domainkey.example.com. В ней пары тег=значение: p= — ключ в base64, обязателен, k= — тип ключа, t= — флаги. Получатели берут её, чтобы проверить DKIM-Signature входящей почты. У домена их может быть много, по одной на селектор, обычно по одной на сервис отправки.

Как найти свой селектор DKIM?

Откройте любое письмо, отправленное доменом, посмотрите исходное сообщение и найдите заголовок DKIM-Signature: значение после s= — это селектор, а d= — домен. В Gmail: Ещё (⋮) › «Показать оригинал»; в Outlook в Интернете: View › View message source. Или вставьте письмо в «Проверить письмо» выше: оно само прочитает s= и d=.

Почему проверка не находит ключ, хотя почта подписана?

Потому что DNS не умеет перечислять селекторы: ключ находится, только если спросить его точное имя. Проверка спрашивает 140 имён, которыми пользуются провайдеры; если ваш домен подписывает другим (Amazon SES и Postmark создают по одному на аккаунт), перебор его не увидит. Добавьте селектор из s= письма, и он проверится первым, или проверьте само письмо.

Годится ли ещё ключ DKIM на 1024 бита?

Он ещё работает: RFC 8301 требует от проверяющих принимать ключи RSA от 1024 до 4096 бит, а Gmail и Yahoo задают 1024 бита как минимум. Но RFC 8301 просит от подписывающих не менее 2048 бит, а M3AAWG называет 1024 «на грани взлома». Запланируйте замену: Microsoft 365 и Google Workspace предлагают ключи на 2048 бит. RFC 8301 велит проверяющим отвергать ключи короче 1024 бит.

Что значит пустой p=?

Пустой p= означает, что ключ отозван: подписи с этим селектором не проходят, как будто ключа нет. Обычно это сделано намеренно. Google так хранит свои старые датированные селекторы, а Fastmail и Microsoft 365 держат пустые резервные селекторы, чтобы перейти на них при ротации. Проблема возникает, только если это тот селектор, которым ваша почта подписана сегодня.

Что значит t=y в записи DKIM?

t=y помечает ключ как тестовый: получатели должны считать почту с ним неподписанной, даже если подпись проверяется. Это нужно для первой настройки, и о нём часто забывают. t=s — другое: он значит «строгий», то есть i= в подписях должен быть в точности доменом подписи, а не поддоменом. Некоторые почтовые сервисы публикуют t=s в своих ключах; ключи SendGrid для github.com его содержат.

Почему DKIM не проходит с ошибкой «body hash did not verify»?

Тело, которое хешировал получатель, не совпадает со значением bh= в подписи, то есть тело изменилось после подписания. Это вызывают рассылки, добавляющие футер, защитные шлюзы, переписывающие ссылки, и дисклеймеры, которые добавляет сервер. Если подпись заголовков всё же проверяется, письмо подлинное, но изменённое; проверка на этой странице смотрит оба случая отдельно.

Переживает ли DKIM пересылку письма?

Обычно да. Пересылающий сервер, который передаёт письмо без изменений, сохраняет подпись действительной, потому что DKIM подписывает содержимое, а не путь. Этим он отличается от SPF, который не проходит на IP-адресе пересылающего сервера. Пересылки, меняющие письмо, например рассылки с футером или тегом в теме, ломают DKIM; ARC позволяет им поручиться за исходный результат.

Нужен ли DKIM, если уже есть SPF?

Да. SPF ломается при пересылке и охватывает только скрытый адрес MAIL FROM, а DKIM переживает пересылку и может выровняться с доменом From:, который проверяет DMARC. Gmail и Yahoo требуют оба от массовых отправителей, Outlook.com — с мая 2025 года, а RFC 9989 просит домены с p=reject подписывать почту DKIM.

Как часто менять ключи DKIM?

M3AAWG рекомендует не реже раза в полгода. Опубликуйте новый ключ в новом селекторе, переключите подпись на него, держите старый ключ опубликованным от 7 до 30 дней, чтобы письма в пути ещё проверялись, затем опустошите его p=, а не удаляйте. Никогда не используйте имя селектора повторно. Хостинг-провайдеры с селекторами CNAME меняют ключи за вас.

Загружается ли моё письмо, когда я проверяю его здесь?

Нет. Этот валидатор DKIM проверяет письмо в вашем браузере: публичный DNS спрашивают только об именах ключей (s._domainkey.d), а dnsrobot.net — только о политике DMARC домена From и доменов подписи. Единственное исключение — подпись Ed25519, которую браузер проверить не может: тогда страница спросит вас, прежде чем один раз отправить письмо на наш сервер, который проверит его в памяти и ничего не сохранит.

Можно ли использовать ключ DKIM Ed25519?

Да. RFC 8463 определяет его и требует от проверяющих его поддержки. Для обратной совместимости опубликуйте его в отдельном селекторе рядом с ключом RSA и подписывайте каждое письмо дважды, как archlinux.org с dkim-ed25519 и dkim-rsa: получатели, не умеющие проверять Ed25519, всё равно получат подпись RSA. Microsoft 365 и Google Workspace предлагают только ключи RSA.

Чего-то не хватает?Предложите функцию или новый инструмент