【问题标题】:How to calculate 'b' parameter in DKIM SIGNATURE如何计算 DKIM SIGNATURE 中的“b”参数
【发布时间】:2019-10-30 02:21:21
【问题描述】:

我正在尝试使用 DKIM 协议对使用 SMTP 命令(使用 telnet)发送的消息进行签名,我在官方 dkim 网站上应用了所有步骤,它仍然是我如何计算“b”参数的方法,我应该验证它吗用私钥?还是使用其他方法? 谢谢

【问题讨论】:

    标签: smtp rsa dkim


    【解决方案1】:

    这一切都在这个文档中解释了: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
    

    如果 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=
    

    【讨论】:

    • 欢迎提供解决方案的链接,但请确保您的答案在没有它的情况下有用:add context around the link 这样您的其他用户就会知道它是什么以及为什么会出现,然后引用最相关的内容您链接到的页面的一部分,以防目标页面不可用。 Answers that are little more than a link may be deleted.
    • 我认为您不熟悉 IETF?他们不倾向于移动他们的文件。无论如何,我已经更新了我的答案。没有必要对它投反对票。
    • 谢谢您,我应该像这样签署与 DKIM-Signature 连接的标头,几乎清楚一件事:主题:HelloMarket from:zlg59 to:larysweng@gmail.com DKIM -签名:v=1;一个=rsa-sha1; c=放松/放松; s=选择器1; d=域名.com; h=主题:从:到; i=zlg59\@domaine.com; bh=rcr9nmkeqsjAGn29CUiUNJFRSmc=; b=
    • 是的,您签署了您正在生成的 DKIM-Signature 标头,您唯一留下的是 base64 编码的 b 参数 ,但留下 @987654336 @ 作为标题的一部分。 正是您在评论中所说的。
    • 我比较了 PowerMTa 生成的 'b=' 值和我的脚本不匹配,有些问题,你能看到这个内容有什么问题吗:主题:HelloMarket from:zlg59 to:larysweng@gmail.com DKIM-签名:v=1;一个=rsa-sha1; c=放松/放松; s=选择器1; d=域名.com; h=主题:从:到; i=zlg59\@domaine.com; bh=rcr9nmkeqsjAGn29CUiUNJFRSmc=; b=
    【解决方案2】:

    原始标题:

    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
    

    【讨论】:

    • 您为什么不像我告诉您的那样将 DKIM-Signature 标头字段小写?为什么你对 DKIM-Signature 标头值进行换行?你不应该那样做。
    • 我做了 (h=subject:from:to;)
    • 你的意思是我应该把这部分“DKIM-Signature”小写吗?
    • 是的,当然。这规范所说的,不是吗?
    • 您在解释中的示例显示 DKIM-Signature 不是 dkim-signature ,不是吗?
    【解决方案3】:
    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”分割标题和dkim-signature吗?
    • 每一行都应该以\r\n结尾,是的。
    • 是的,我现在看起来没问题。
    • 即使是 dkim-signature 行也应该在 b=" 之后以 "\r\n" 结尾?
    【解决方案4】:

    这是要签名的新内容:

    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; ...
    【解决方案5】:

    很遗憾,它与 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
    

    【讨论】:

    • 我已经更新了我的答案。您没有正确规范化 DKIM-Signature h= 值。换句话说,它不应该是小写的。
    • 仍然没有确定,这是新signautre:Q7nW7tnzeGKapnpgDuW4xJS4sMmxL + bQChC4qjRWr + 3pZ7CGtA25LHe9g8NBlNWAavRjKNvglQLO VeuAXG / bimxCOe5mlwqEdoQjRAX0gCarmrRR0 / jsLzJm + tRZWaPEuMaLBU7H71GqCykmUIUqqBgJ WIEtD976Gj6xgcLsVgs = 跨度>
    • 您好,没关系,我只需要删除 dkim-signature 行末尾的 CRLF。非常感谢您的帮助,非常感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 2015-12-19
    • 1970-01-01
    相关资源
    最近更新 更多