dkim-headers-canon

<domain>

Насколько терпима подпись к правке заголовков в пути
в конфигурации это строкаdkim-headers-canon relaxedвнутри блока <domain>
Что считать изменением заголовка

Между вашим узлом и почтовым ящиком письмо проходит через чужие серверы, и они переоформляют заголовки: переносят длинные строки, схлопывают пробелы, меняют регистр имён. Содержание при этом не меняется, а байты меняются — и подпись по ним ломается.

Канонизация решает, что считать изменением. Умолчание relaxed приводит заголовки к общему виду перед подписью и перед проверкой: имя в нижний регистр, пробелы в один, перенос убран. simple не прощает ничего: любой байт не на месте — подпись не сходится.

Пара к этой строке — dkim-body-canon: та же развилка для тела письма. В подписи они стоят рядом, в поле c=, через косую черту.

Главная ловушка — simple для заголовков в открытом интернете. Переоформление заголовков делают не злоумышленники, а обычные почтовые узлы по пути; при simple подпись ломается у той доли получателей, чья почта идёт через посредника, — и доля эта непредсказуема.
Что делает Хаб. Не пишет — остаётся вендорское relaxed, и это верное значение. simple имеет смысл там, где путь письма контролируется целиком; в рассылке такого не бывает.
Рекомендуемые значения

Оставьте relaxed. Это умолчание и здесь, и в подавляющем большинстве чужих конфигураций.

simple — только для контролируемого пути. Например, между двумя своими узлами, где посредников нет.

Разные значения для тела и заголовков допустимы. Обычно берут relaxed для обоих, но пара relaxed/simple встречается — в подписи она видна прямо, в поле c=.

Совет держать терпимый способ — наш. Из руководства здесь оба значения и умолчание.
Пример в конфигурации
# умолчание оставлено намеренно: путь письма нам не подконтролен
<domain *>
    dkim-headers-canon relaxed    dkim-body-canon relaxed
</domain>
Обе строки вместе дают то, что в подписи выглядит как c=relaxed/relaxed, — самый терпимый к правке в пути вариант.
жёлтым — — имена директив, голубым — блоки. Так же они подсвечены и в тексте карточки.
▲

Типичные ошибки и проблемы

что делают не так и чем это кончается2 ошибки▶

Ставят simple ради строгости

наш опыт

Чем чреватоСтрогость здесь не защищает, а ломает: заголовки переоформляют обычные почтовые узлы по пути. Подпись перестаёт сходиться у непредсказуемой доли получателей.
Как заметитьПровалы проверки у части получателей при верном ключе и правильном наборе заголовков.
Как правильноВернуть relaxed.

Меняют канонизацию, разбираясь с провалами проверки

наш опыт

Чем чреватоПричина почти никогда не в ней: чаще виноват ключ, набор заголовков или предел длины тела. Правка канонизации меняет подпись, не устраняя причину, и запутывает разбирательство.
Как заметитьЗначение меняли, доля провалов та же.
Как правильноСмотреть поля d=, s= и h= в подписи — там видно, каким ключом и что подписано.
Совместимость
PowerMTA 6.0
описана в руководстве этой версии · платформа: любая
С какой версии директива доступна, вендор указывает не для всех — здесь пометки нет. Имя встречается и в издании руководства 5.0.
Справочные данные
Синтаксис
dkim-headers-canon <enumeration>
Значения
simple или relaxed
Умолчание
relaxed § 3.3.10.23
Применение
reload, перезапуск не нужен
Очередь
уже поставленное в очередь не затронет
Где писать
<domain>
Сколько раз
один раз в блоке
Всё здесь — из руководства, с разделом.
Наследование
Значение сливается по блокам <domain> от общего к частному: побеждает наиболее подходящий блок, а не последний по файлу. Подхватывается по pmta reload; на письма в очереди действует со следующей попытки.
Как проверить на узле
Действующее значение печатает команда настроек очереди; что вышло на самом деле — видно в поле c= подписи:
pmta show settings gmail.com/vmta1 | grep -i canon
grep -i 'DKIM-Signature' /var/log/pmta/pmta.log | tail -3
В поле c= первым стоит способ для заголовков, вторым для тела. Хаб этой строки не пишет — остаётся вендорское значение.
В Хабе
Цена ошибки
обратимо: вредит, пока стоит
Сценарии
Подпись и аутентификация писем