Вопрос или проблема
Я пытаюсь ввести 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, то не используйте переносы строк (только пробелы) между частями.
"сделайте это" "таким образом"
"не так как"
"это"
Я знаю, что этот пост древний, но я нашел его сегодня, запрашивая “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 правильно настроена и функционирует так, как необходимо.