Как ввести сильный (длинный) DKIM-ключ в DNS?

Вопрос или проблема

Я пытаюсь ввести 4028-битный ключ DKIM в DNS, и кажется, что я превышаю как предел UDP в 512 байт, так и максимальный размер записи для TXT-записи.

Как правильно создать большой ключ (с подразумеваемым большим размером кодирования) и импортировать его в DNS?

Вам нужно разделить его в текстовом поле. Я считаю, что практический предел для размеров ключей — 2048. Разделите текстовое поле на части по 255 символов или меньше. Каждое разделение создает накладные расходы.

Существуют два формата для длинных полей.

TXT  "часть первая" \
     "часть вторая"
TXT ( "часть первая"
      "часть вторая" )

Обе части будут объединены как “часть перваячасть вторая”. Дополнительные подробности от Zytrax.

Чтобы сгенерировать запись DKIM, я вставляю свой файл открытого ключа и оборачиваю его в кавычки.
Мой файл открытого ключа содержит следующее:

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD78Ki2d0zmOlmjYNDC7eLG3af12KrjmPDeYRr3
q9MGquKRkRFlY+Alq4vMxnp5pZ7lDaAXXwLYjN91YY7ARbCEpqapA9Asl854BCHMA7L+nvk9kgC0
ovLlGvg+hhqIPqwLNI97VSRedE60eS+CwcShamHTMOXalq2pOUw7anuenQIDAQAB

После редактирования ключ в моем файле зоны DNS выглядит следующим образом:

dkim3._domainkey        IN      TXT     ("v=DKIM1; t=s; p=" 
"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD78Ki2d0zmOlmjYNDC7eLG3af12KrjmPDeYRr3"
"q9MGquKRkRFlY+Alq4vMxnp5pZ7lDaAXXwLYjN91YY7ARbCEpqapA9Asl854BCHMA7L+nvk9kgC0"
"ovLlGvg+hhqIPqwLNI97VSRedE60eS+CwcShamHTMOXalq2pOUw7anuenQIDAQAB")

DNS возвращает это так:

 bill:~$ host -t TXT dkim3._domainkey.systemajik.com
 dkim3._domainkey.systemajik.com descriptive text "v=DKIM1\; t=s\; p=" "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD78Ki2d0zmOlmjYNDC7eLG3af12KrjmPDeYRr3" "q9MGquKRkRFlY+Alq4vMxnp5pZ7lDaAXXwLYjN91YY7ARbCEpqapA9Asl854BCHMA7L+nvk9kgC0" "ovLlGvg+hhqIPqwLNI97VSRedE60eS+CwcShamHTMOXalq2pOUw7anuenQIDAQAB"

DNS рассматривает это как одну длинную строку без лишних пробелов, где строки соединяются. Все последовательности " " игнорируются.

Если это Amazon Route 53, то не используйте переносы строк (только пробелы) между частями.

"сделайте это" "таким образом"

"не так как"
"это"

Смотрите https://serverfault.com/a/763871/80856

Я знаю, что этот пост древний, но я нашел его сегодня, запрашивая “DKIM 2048 битный ключ с UltraDNS”. Наша команда DNS попыталась разделить ключ на две части с кавычками вокруг и пробелом между ними. Это вызывало бы подачу UltraDNS трех пакетов (средний был пустым), что приводило к непоследовательным результатам проверки.

Что сработало для меня в панели управления UltraDNS, так это отправка всей записи в кавычках без множества наборов кавычек, разделителей и т.д. Теперь работает, как и ожидалось.

Если вы используете пользовательский интерфейс poweradmin для pdns, вы можете просто ввести всю строку dkim в поле ввода.

v=DKIM1;k=rsa;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxtR3bw1Kbh1B7q4+5aWjTj2YEFwv230gcv+NMp4KouOSLdIr0mCMiwDZpY+7zCdks0zMXtz+F5TPij/NkSAxIKBbJqbIO3mvAhgeI0Vy5aQ5prwnIyXUj54po6AsXbv5Ud2tFbGSsdIhvWiC755d3WaFs8mdWFkpSxprlW6PobCzOWDayWGCvsNfHpjmTxHZinkd3TmLQqE/O6Nb1YnRwQwUCLioSyudV+5Bd2+rXZ2V9FYAOiK2aQi2aSTiUaLCVxft9H6xen3JDaKsuu43QMBrhydoJOCV2QaY82IxqE3GgZrlADu6YEOfotdwD2aA9GRwVB88GqdXL8HwgEGTbwIDAQAB;

Это не самый красивый скрипт, но он экономит время и ошибки на моих хостах named/bind.

#!/usr/bin/env bash
pretty_dkim() {
  grep DKIM1 | sed 's/.*v=DKIM/v=DKIM/' | fold -s -w76 |sed 's/^/"/g;s/$/"/g;1 s/^/(/' | tac | sed '1 s/$/)/'| tac ;
}
if [ -t 0 ]; then 
  cat "$1" | pretty_dkim;
else
  pretty_dkim ;
fi

И если новые строки не нужны, вы можете добавить | tr '\n' ' '

Это нормально, если запись превышает предел UDP в 512 байт, потому что DNS будет использовать TCP.

Это должно быть прозрачным для пользователя, но иногда проблемные устройства брандмауэра (такие как Cisco PIX/ASA) могут фильтровать или блокировать эти большие запросы.

Для Windows DNS Server:

  • Не используйте кавычки
  • Разделите строку на несколько строк
  • Каждая строка не должна превышать 255 символов
  • Не забудьте оставить пробел в конце каждой строки (так как они будут объединены непосредственно соседними друг с другом)

Если вы используете MySQL/MariaDB в качестве бэкенда DNS, как PowerDNS, вы можете изменить размер вашего столбца контента.

Дефолтная длина контента PowerDNS — VARCHAR(255)

Таким образом, ваша подпись DKIM будет обрезана до 255 символов

чтобы исправить это

просто измените размер контента через MySQL CLI / MariaDB CLI

mysql -u root -p

USE powerdns;
alter table records modify column content text not null;

перезапустите вашу службу DNS (например, PowerDNS)

service pdns restart

Ответ или решение

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

1. Генерация DKIM-ключа

Сначала вам нужно сгенерировать ваш DKIM-ключ. В большинстве случаев это делается с помощью утилит, таких как OpenSSL. Например, вы можете использовать следующую команду для генерации RSA-ключа:

openssl genrsa -out private.key 2048
openssl rsa -in private.key -pubout -out public.key

После этого у вас будет файл с открытым и закрытым ключами.

2. Форматирование DKIM-записи

Сам DKIM-ключ будет представлять собой строку, начинающуюся с v=DKIM1; k=rsa; p=, за которой следует ваш открытый ключ. При добавлении ключа в DNS запомните, что строка должна быть разбита на части, если ее длина превышает ограничения DNS.

  • Ограничения на длину записи: Каждая часть строки в записи TXT не должна превышать 255 символов.
  • Общая длина записи: Запись может превышать 512 байт, но обязательно нужна корректная обработка. В некоторых случаях, например, с Cisco PIX/ASA, пакеты такого размера могут быть заблокированы фаерволом.

3. Разделение DKIM-записи

Для исправления длины строки вам нужно разбить ключ на части. Например, ваш DKIM-запись может выглядеть следующим образом:

dkim3._domainkey.example.com. IN TXT (
  "v=DKIM1; k=rsa; p="
  "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD78Ki2d0zmOlmjYNDC7eLG3af12KrjmPDeYRr3"
  "q9MGquKRkRFlY+Alq4vMxnp5pZ7lDaAXXwLYjN91YY7ARbCEpqapA9Asl854BCHMA7L+nvk9kgC0"
  "ovLlGvg+hhqIPqwLNI97VSRedE60eS+CwcShamHTMOXalq2pOUw7anuenQIDAQAB"
)

4. Установка DKIM-записи в DNS

Теперь, когда ваша DKIM-запись корректно отформатирована, вы можете добавить ее в вашу DNS-зону. В зависимости от используемого интерфейса управления DNS, процесс может различаться:

  • Для Amazon Route 53: Не используйте переносы строк (только пробелы между частями).
"v=DKIM1; k=rsa; p=" "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD78Ki2d0zmOlmjYNDC7eLG3af12KrjmPDeYRr3" ...
  • Для Windows DNS Server: Разделите строку на несколько строк, не добавляйте кавычки, и каждая строка должна оканчиваться пробелом.

5. Дополнительные настройки

  • Если вы используете MySQL или MariaDB как бэкенд для DNS, убедитесь, что размер столбца, содержащего данные (например, content), достаточен для хранения длинных записей. Вы можете изменить его, используя команду:
ALTER TABLE records MODIFY COLUMN content TEXT NOT NULL;

После этого обязательно перезапустите ваш DNS-сервис.

Заключение

Следуя данным шагам, вы сможете успешно создать и добавить длинный DKIM-ключ в DNS. Убедитесь, что все части строки обработаны правильно, чтобы избежать проблем с валидацией. Не забудьте протестировать вашу DKIM-запись, используя инструменты для проверки DKIM-подписей, такие как dig:

dig TXT dkim3._domainkey.example.com

Это поможет убедиться, что запись DNS правильно настроена и функционирует так, как необходимо.

Оцените материал
Добавить комментарий

Капча загружается...