Все это объяснено в этом документе: https://www.ietf.org/rfc/rfc6376.txt
Сначала вы должны канонизировать поля заголовков, которые вы хотите подписать, включая заголовок DKIM-Signature
, который вы собираетесь сгенерировать, а затем подписывать его, используя выбранный вами алгоритм подписи.
«Простой» алгоритм канонизации заголовка
«Простой» алгоритм канонизации заголовка не меняет заголовок
поля никак. Поля заголовка ДОЛЖНЫ быть представлены подписи или
алгоритм проверки в точности, как они есть в сообщении
подписано или проверено. В частности, имена полей заголовка НЕ ДОЛЖНЫ быть
сложенный регистр и пробел НЕ ДОЛЖНЫ быть изменены.
Алгоритм канонизации "расслабленного" заголовка
НЕОБХОДИМО, чтобы алгоритм канонизации "расслабленного" заголовка применял
следующие шаги по порядку:
Преобразовать все имена полей заголовка (не значения полей заголовка) в
в нижнем регистре. Например, преобразуйте «SUBJect: AbC» в «subject: AbC».
Развернуть все строки продолжения поля заголовка, как описано в
RFC5322 ; в частности, строки с терминаторами, встроенными в
продолженные значения поля заголовка (то есть последовательности CRLF, сопровождаемые
WSP) ДОЛЖЕН интерпретироваться без CRLF. Реализации ДОЛЖНЫ
НЕ удаляйте CRLF в конце значения поля заголовка.
Преобразование всех последовательностей из одного или нескольких символов WSP в один SP
персонаж. WSP-символы включают в себя символы до и после
линия сгиба границы.
Удалить все символы WSP в конце каждого развернутого поля заголовка
значение.
Удалите все символы WSP, оставшиеся до и после двоеточия
отделяя имя поля заголовка от значения поля заголовка.
ДОЛЖЕН быть сохранен разделитель двоеточия.
Канонизация заголовка DKIM-Signature
Как только вы канонизируете все остальные заголовки, которые хотите подписать, вам нужно применить ту же канонизацию к подписи DKIM, которую вы генерируете.
Очевидно, что в этот момент у вас еще не будет значения b=
, потому что результатом подписания канонизированных заголовков является значение для тега b=
.
Вам нужно создать заголовок, но оставить тег b=
пустым.
Например:
DKIM-Signature: v=1; a=rsa-sha256; d=example.net; s=brisbane;
c=simple; q=dns/txt; i=@eng.example.net;
t=1117574938; x=1118006938;
h=from:to:subject:date;
bh=MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI=;
b=
Подписание канонизированных заголовков
Как только вы канонизировали все заголовки, которые хотите подписать (плюс часть генерируемого вами заголовка DKIM-Signature), вам необходимо подписать результат, используя алгоритм и закрытый ключ (а не открытый ключ! !), а затем base64 кодирует результат и добавляет его в сгенерированный вами заголовок DKIM-Signature.
В приведенном выше примере вы будете использовать алгоритм RSA-SHA256.
Обновление:
Если заголовки исходного сообщения, которое вы хотите подписать, выглядят так:
Subject: ddddd
From: btt@domain.com
To: email@gmail.com
И если заголовок DKIM-Signature, который генерирует PowerMTA, выглядит следующим образом:
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; s=selector1; d=domain.com; h=Subject:From:To; i=btt@domain.com; bh=rcr9nmkeqsjAGn29CUiUNJFRSmc=; b=j/jYKloUFEbmzj5JdwmR7MCBB+UtuJq5V0wImYElaY/xob8CnRY39Z0TfPonp4y2qtIE/wpqwnT0
YrHcNM8BY3uQ3ovm3pq7lTmwvM6XqA4rgnlhcyZnQO9uoUSGebsbR8KBhwZSpolF7UEcr8TSQdfO
OG+fDZIHeq6G7DAg5cQ=
Тогда текст, который вы должны подписать, будет выглядеть следующим образом (при условии, что вы хотите, чтобы значение b=
совпадало со значением b=
, которое генерирует PowerMTA):
subject:ddddd
from:btt@domain.com
to:email@gmail.com
dkim-signature:v=1; a=rsa-sha1; c=relaxed/relaxed; s=selector1; d=domain.com; h=Subject:From:To; i=btt@domain.com; bh=rcr9nmkeqsjAGn29CUiUNJFRSmc=; b=