Сообщение об ошибке
dkim=fail reason="signature verification failed"
Также выводится как
- dkim=fail (bad signature)
OpenDKIM пишет `dkim=fail reason="signature verification failed"` и при изменении заголовков, и при изменении тела (воспроизведено на OpenDKIM 2.11.0). mailauth их различает: «bad signature» для заголовков, «body hash did not verify» для тела.
Что это означает
Принимающий сервер нашёл ключ DKIM и вычислил подпись по письму в том виде, в каком оно пришло, но она не совпала: подписанные заголовки (а для OpenDKIM ещё и тело) изменились после того, как отправитель подписал письмо, или опубликованный ключ не соответствует ключу подписи. DKIM подписывает точные байты после канонизации, поэтому любое изменение на ретрансляторе — метка в теме, приписка в конце письма, перекодированная часть MIME — ломает подпись. Для DMARC это считается непройденной проверкой DKIM.
Почему это происходит
Ретранслятор изменил подписанный заголовок
частоСписки рассылки, которые добавляют метку в тему (`[team]`), шлюзы, которые переписывают `From` или `To`, или устройства защиты, которые меняют `Content-Type`. Подпись распространяется на каждый заголовок, перечисленный в `h=`.
Приписки в конце письма, дисклеймеры или изменение кодировки
частоДописанные дисклеймеры, переписывание ссылок, баннеры антивируса или преобразование 8-битного содержимого в quoted-printable изменяют тело письма. Без `l=` учитывается каждый байт.
Ключ в DNS не совпадает с ключом подписи
иногдаПосле ротации ключей в TXT-записи селектора остался старый открытый ключ, или два сервера подписывают с одним селектором, но разными закрытыми ключами.
Подписант изменил письмо после подписи
иногдаПодпись ставится до того, как фильтр содержимого добавляет заголовки или переписывает письмо (порядок milter в Postfix), или библиотека отправителя подписывает письмо, а затем меняет окончания строк.
Как исправить
- 1.
Сравните подписанные заголовки с полученными
Тег `h=` перечисляет, что было подписано. Сравните эти заголовки в полученной копии с копией у отправителя (из папки «Отправленные»).
bash # Which headers did the signature cover, and what do they look like now? grep -i "^DKIM-Signature" -A4 received.eml | grep -o "h=[^;]*" grep -iE "^(From|To|Subject|Date|Message-ID|Content-Type):" received.eml - 2.
Для списков рассылки и пересылки: ARC и повторная подпись
Посредникам, которым приходится изменять письма, следует добавлять заголовки ARC и подписывать письма от имени своего домена, чтобы получатели всё равно могли оценить исходную аутентификацию.
text # Mailing list / forwarder: add ARC and re-sign with the list's own domain (Mailman 3 example) [ARC] enabled: yes authserv_id: lists.example.org domain: lists.example.org selector: arc2026 privkey: /etc/mailman3/arc.private - 3.
Проверьте, что ключ в DNS соответствует закрытому ключу
`opendkim-testkey` подтверждает, что запись, опубликованная для селектора, соответствует ключу, которым пользуется подписант.
bash opendkim-testkey -d example.com -s sel -k /etc/opendkim/keys/sel.private -vvv # DNS record matches the private key?