如何计算 DKIM SIGNATURE 中的 'b' 参数
How to calculate 'b' parameter in DKIM SIGNATURE
我正在尝试使用 DKIM 协议签署通过 SMTP 命令(使用 telnet)发送的消息,我在官方 dkim 网站上应用了所有步骤,它仍然是我如何计算 'b' 参数,我应该用私钥验证它吗?或者使用另一种方法? 谢谢
本文档中均有说明:https://www.ietf.org/rfc/rfc6376.txt
首先,您必须规范化您希望签名的 header 字段,包括您将要生成的 DKIM-Signature
header,然后使用您使用的签名算法对其进行签名已经选择了。
"simple"Header规范化算法
"simple" header 规范化算法没有改变 header 以任何方式的领域。 Header 字段必须提交给签名或 验证算法与消息中的完全一样 签名或验证。特别是,header 字段名称不能是 大小写折叠且不得更改空格。
"relaxed"Header规范化算法
"relaxed" header 规范化算法必须应用 按顺序执行以下步骤:
将所有 header 字段名称(不是 header 字段值)转换为 小写。例如,将 "SUBJect: AbC" 转换为 "subject: AbC".
展开所有 header 字段续行,如中所述 RFC5322;特别是,带有嵌入终止符的行 继续 header 字段值(即 CRLF 序列后跟 WSP) 必须在没有 CRLF 的情况下进行解释。实施必须 不要删除 header 字段值末尾的 CRLF。
将一个或多个 WSP 字符的所有序列转换为单个 SP 特点。这里的 WSP 字符包括字符前后的字符 线折叠边界.
删除每个展开的header字段末尾的所有WSP字符 价值.
删除冒号前后剩余的任何 WSP 字符 将 header 字段名称与 header 字段值分开。这 必须保留冒号分隔符。
规范化 DKIM-Signature header
一旦您规范化了您希望签名的所有其他 header,您就需要对您正在生成的 DKIM-Signature 应用相同的规范化。
显然,此时您还没有 b=
值,因为签署规范化 headers 的结果是 b=
标签的值。
您需要做的是构造 header 但将 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=
签署规范化 headers
一旦您规范化了所有要签名的 header(加上您生成的 DKIM-Signature header 的部分),您需要签署使用算法和私钥(不是 public 密钥!!)的结果,然后对结果进行 base64 编码并将其附加到您生成的 DKIM-Signature header。
在上面的示例中,您将使用 RSA-SHA256 算法。
更新:
如果您要签名的原始邮件 header 如下所示:
Subject: ddddd
From: btt@domain.com
To: email@gmail.com
如果 PowerMTA 生成的 DKIM-Signature header 如下所示:
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=
值与PowerMTA生成的b=
值相匹配) :
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=
原文Header:
Subject: ddddd
From: btt@domain.com
To: email@gmail.com
规范化 header 与 DKIM-SIGNATURE :
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=
RSA 命令对内容进行签名(header+Dkimsignature)
openssl dgst -sha1 -sign privateKey.pem content.txt | base64
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=
这是要签名的新内容:
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=
不幸的是,它与 PowerMta 生成的签名不匹配。
'b' 由我签名生成:
lNLa3tKsq6IEotwq6Go5vPUjj6zbzpIEqC7Mr90SZFrXPVBNZbHyO4igroLE5Ax77lAAAwEX9+cN
TCeIbzYE08K7kB7I4/k8McDe3T5V+T2jcZuR3ukWK12BkQBAmFZNogynId0tt1WPXK3zHDGdKpHC
oxu5gKfrEVNsHo7gyRc=
用PowerMta测试后header:
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=
Subject: ddddd
From: btt@domain.com
To: email@gmail.com