【发布时间】:2019-10-30 02:21:21
【问题描述】:
我正在尝试使用 DKIM 协议对使用 SMTP 命令(使用 telnet)发送的消息进行签名,我在官方 dkim 网站上应用了所有步骤,它仍然是我如何计算“b”参数的方法,我应该验证它吗用私钥?还是使用其他方法? 谢谢
【问题讨论】:
我正在尝试使用 DKIM 协议对使用 SMTP 命令(使用 telnet)发送的消息进行签名,我在官方 dkim 网站上应用了所有步骤,它仍然是我如何计算“b”参数的方法,我应该验证它吗用私钥?还是使用其他方法? 谢谢
【问题讨论】:
这一切都在这个文档中解释了:https://www.ietf.org/rfc/rfc6376.txt
首先,您必须规范化您希望签名的标头字段,包括您将要生成的 DKIM-Signature 标头,然后使用您选择的签名算法对其进行签名。
“简单”标头规范化算法不会更改标头 任何方式的领域。标头字段必须提供给签名或 验证算法与消息中的完全相同 签名或验证。特别是,标题字段名称不得 大小写折叠且空格不得更改。
“宽松”标头规范化算法必须应用 按顺序执行以下步骤:
将所有标题字段名称(不是标题字段值)转换为 小写。例如,将“SUBJect: AbC”转换为“subject: AbC”。
展开所有标题字段续行,如中所述 RFC5322;特别是带有嵌入终止符的行 连续的头字段值(即 CRLF 序列后跟 WSP) 必须在没有 CRLF 的情况下进行解释。实现必须 不要删除头字段值末尾的 CRLF。
将一个或多个 WSP 字符的所有序列转换为单个 SP 特点。此处的 WSP 字符包括 折线边界。
删除每个展开的标题字段末尾的所有 WSP 字符 价值。
删除冒号前后剩余的所有 WSP 字符 将标头字段名称与标头字段值分开。这 必须保留冒号分隔符。
一旦您规范化了您希望签名的所有其他标头,您就需要对您正在生成的 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
如果 PowerMTA 生成的 DKIM-Signature 标头如下所示:
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=
【讨论】:
b 参数 值,但留下 @987654336 @ 作为标题的一部分。 正是您在评论中所说的。
原始标题:
Subject: ddddd
From: btt@domain.com
To: email@gmail.com
带有 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=
【讨论】:
:后面的空格
\r\n结尾,是的。
这是要签名的新内容:
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=
【讨论】:
: 后面的空格,用于dkim-signature 标头。它应该看起来像这样:dkim-signature:v=1; ...
很遗憾,它与 PowerMta 生成的签名不匹配。
'b'由我的签名生成:
lNLa3tKsq6IEotwq6Go5vPUjj6zbzpIEqC7Mr90SZFrXPVBNZbHyO4igroLE5Ax77lAAAwEX9+cN
TCeIbzYE08K7kB7I4/k8McDe3T5V+T2jcZuR3ukWK12BkQBAmFZNogynId0tt1WPXK3zHDGdKpHC
oxu5gKfrEVNsHo7gyRc=
使用 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=
Subject: ddddd
From: btt@domain.com
To: email@gmail.com
【讨论】:
h= 值。换句话说,它不应该是小写的。