如何计算 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