Как DKIM находит ключ
Подпись DKIM в сообщении указывает домен (d=) и селектор (s=). Получатель объединяет их в selector._domainkey.domain, считывает расположенную там TXT-запись и использует открытый ключ из тега p= для проверки подписи. Домен может публиковать любое количество селекторов, поэтому у каждого сервиса отправки может быть свой ключ, а ключи можно менять без простоя.
Для проверки нужен селектор, потому что DNS не позволяет получить список селекторов домена. Сканировать нечего, селектор берется из подписи реального сообщения.
Почему ключ DKIM слабый или нерабочий
RFC 8301 требует, чтобы длина ключей RSA составляла не менее 1024 бит, и рекомендует 2048 бит. Проверяющая сторона может игнорировать более короткий ключ, и наш инструмент так и делает, поэтому ключ длиной 512 бит считается полным отсутствием подписи. Ключи Ed25519 (RFC 8463) короткие по своей конструкции и при этом надежные, но пока не все получатели их проверяют. Поэтому обычно их публикуют рядом с ключом RSA, а не вместо него.
Инструмент полностью декодирует ключ, потому что ключ из записи, неправильно разделенной на строки TXT, или из некорректного base64 не сможет использовать ни один получатель. Пустое значение p= означает, что ключ был намеренно отозван. t=y указывает, что домен все еще находится в режиме тестирования, а RFC 6376 §3.6.1 предписывает проверяющим обрабатывать его письма так же, как письма без подписи.
Вопросы
Как найти селектор DKIM и понять, включен ли DKIM?
Отправьте себе письмо и откройте заголовки полученной копии. Наличие заголовка DKIM-Signature означает, что письмо подписано: селектор указан в значении s=, а домен в d=. Если такого заголовка нет, сервис, через который вы отправили письмо, не подписывает его. Каждый сервис отправки использует собственный селектор, поэтому у рассылки и письма из вашего почтового ящика селекторы могут различаться.
Ключ в порядке, но проверка DKIM завершается ошибкой "body hash did not verify". Почему?
Обычно письмо было изменено после подписания, например список рассылки добавил нижний колонтитул или шлюз безопасности переписал ссылку. Ключ может подтвердить только то содержимое, которое было подписано. Полный тест показывает фактический результат проверки вашего письма.
Полное руководство: DKIM fail
Длина ключа DKIM: 1024 или 2048 бит?
Ключ длиной 1024 бита проходит проверку везде, и RFC 8301 допускает его использование. Но это минимальная длина, поэтому при следующей ротации ключей перейдите на 2048 бит.
Может ли у домена быть несколько DKIM-записей?
Да, по одной для каждого селектора. У многих доменов их несколько: одна для почтового провайдера и по одной для каждого сервиса рассылок или выставления счетов. Проверяйте их по очереди. Если ключ удален из DNS, проверка всех писем, которые все еще подписаны этим ключом, завершится ошибкой.
Как часто нужно менять ключи DKIM?
M3AAWG рекомендует менять ключи не реже одного раза в шесть месяцев и немедленно, если закрытый ключ мог попасть к посторонним. Опубликуйте новый ключ с новым селектором, переключите подпись на него и удалите старую запись только после того, как письма, подписанные старым ключом, перестанут поступать. Отправители повторяют попытки доставки в течение четырех-пяти дней, поэтому подождите около недели.