Validation 验证DKIM签名的正确方法(b=部分)

Validation 验证DKIM签名的正确方法(b=部分),validation,rsa,signature,dkim,Validation,Rsa,Signature,Dkim,我正在尝试开发我的家庭电子邮件服务器(在服务器端使用NodeJS,但这并不重要,因为我试图找出原理)。 我过去经常指导自己完成DKIM签名验证例行程序,但它需要一些复杂的步骤,我不知道我的错误在哪里。对于电子邮件示例,我使用了从Mail.ru服务器发送的电子邮件。它应该是完全有效的。这是它的标题: DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mail.ru; s=mail2; h=Reference

我正在尝试开发我的家庭电子邮件服务器(在服务器端使用NodeJS,但这并不重要,因为我试图找出原理)。 我过去经常指导自己完成DKIM签名验证例行程序,但它需要一些复杂的步骤,我不知道我的错误在哪里。对于电子邮件示例,我使用了从Mail.ru服务器发送的电子邮件。它应该是完全有效的。这是它的标题:

DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mail.ru; s=mail2;
    h=References:In-Reply-To:Content-Type:Message-ID:Reply-To:Date:MIME-Version:Subject:To:From; bh=gCWDSCJf58CbaR+wjAV9dydu9JTKkvo1o+0zkj8bNr0=;
    b=pheltY+k/mio2x4CFQV8cXZxNiR7oSTkIsWTOZa1CGpEyK8KVSHY07OWSdZ1aFVtuaV32PbI0mNY0yliuqIbYTsnreFUYFM/iVR5PU74QHAe8yp46ydAYRbzLQu8dy+AkFhPtEdb8CAgoZKXgPLc888/Q6MsVAh6iH1L3SZj87Y=;
Received: by f427.i.mail.ru with local (envelope-from <[my name]@mail.ru>)
    id 1dbP18-0003I9-L7
    for madbr@[domain]; Sat, 29 Jul 2017 13:30:42 +0300
Received: by e.mail.ru with HTTP;
    Sat, 29 Jul 2017 13:30:42 +0300
From: =?UTF-8?B?0KHQtdGA0LPQtdC5?= <[my name]@mail.ru>
To: madbr@[domain]
Subject: =?UTF-8?B?UmU6IA==?=
MIME-Version: 1.0
X-Mailer: Mail.Ru Mailer 1.0
Date: Sat, 29 Jul 2017 13:30:42 +0300
Reply-To: =?UTF-8?B?0KHQtdGA0LPQtdC5?= <[my name]@mail.ru>
X-Priority: 3 (Normal)
Message-ID: <1501324242.448202607@f427.i.mail.ru>
Content-Type: multipart/mixed;
    boundary="----uEhsLqzDWmmGeA9EZ3XNsqSIGjlgVTmA-NI9QMhpqxNHWLEDT-1501324242"
Authentication-Results: f427.i.mail.ru; auth=pass smtp.auth=[my name]@mail.ru smtp.mailfrom=[my name]@mail.ru
X-7FA49CB5: 0D63561A33F958A58B4AE7CD4FB69874B38CA0D04717BA57612FFEEC28D99E31725E5C173C3A84C325A81A29FB5043FD044813140D6DB928F1C9CF18C8EB2269C4224003CC836476C0CAF46E325F83A50BF2EBBBDD9D6B0F2AF38021CC9F462D574AF45C6390F7469DAA53EE0834AAEE
X-Mailru-Sender: 080178E06F6B3F48806FD386034E228604900381AF51F7DD303A634C9E25199A8DFBC783E67F8C0305D8C6CDFE81985CCFB2E39DA8E91CCEEEC687A792225BA622DF1A08BD40178CA471C22AD050A14893AC9912533B2342AE208404248635DF
X-Mras: OK
X-Spam: undefined
In-Reply-To: <1500037364.788302144@mx47.mail.ru>
References: <1500037364.788302144@mx47.mail.ru>
第一步很简单:我得到了消息体,使用

 relaxed: function (data) {
    return data.replace(/[ \t]+\r\n/g, '\r\n').replace(/[ \t]+/g, ' ').replace(/\r\n{2,}$/g, CONST.CRLF);
  }
并创建它的
sha256
(根据
a=
标记)散列。它匹配了
bh=
DKIM签名头中的标签,但我很高兴

对于下一步,我将执行下一步操作:

1) 按照
h=
signature标记中给出的顺序从消息中获取所有必需的头

References: <1500037364.788302144@mx47.mail.ru>
In-Reply-To: <1500037364.788302144@mx47.mail.ru>
Content-Type: multipart/mixed;
    boundary="----uEhsLqzDWmmGeA9EZ3XNsqSIGjlgVTmA-NI9QMhpqxNHWLEDT-1501324242"
Message-ID: <1501324242.448202607@f427.i.mail.ru>
Reply-To: =?UTF-8?B?0KHQtdGA0LPQtdC5?= <[my name]@mail.ru>
Date: Sat, 29 Jul 2017 13:30:42 +0300
MIME-Version: 1.0
Subject: =?UTF-8?B?UmU6IA==?=
To: madbr@[domain]
From: =?UTF-8?B?0KHQtdGA0LPQtdC5?= <[my name]@mail.ru>
4) 从DNS TXT记录中获取公钥并附加
----开始公钥----------结束公钥------
,以实现PEM格式兼容性

5) 最后,我使用标准RSA验证函数对其进行了验证:

crypto.createVerify('sha256')
    .update(header + dkimHeader)
    .verify(publicKey, Buffer.from(signature.b, CONST.BASE64));
但它失败了,我真的不知道该责备哪些行为

在最后一步中,我连接了header和DKIM签名,因为我不太明白“将以下内容传递给 哈希算法的指定顺序为“平均值”。尝试使用
.update(header).update(dkimHeader)
,但没有任何区别

有人能解释一下,我做错了什么吗?

来自RFC部分:

在散列步骤2中,签名者/验证者必须将以下内容传递给 按指定顺序执行哈希算法

  • “h=”标记指定的标题字段,按顺序排列 在该标记中指定,并使用标头进行规范化 “c=”标记中指定的规范化算法。每个 标题字段必须以单个CRLF终止

  • 存在(正在验证)或将要验证的DKIM签名标头字段 被插入(签名)到消息中,使用“b=”的值 标记(包括所有周围空白)已删除(即已处理 作为空字符串),使用标头进行规范化 “c=”标记中指定的规范化算法,不带 尾随的CRLF

  • 我强调了重要的部分:只应删除值,而不应删除完整的标记

    因此,正确的输入的最后一行是(注意末尾的
    b=;
    ):


    哦,终于!非常感谢。我好像已经读了100遍这个地方而没有注意到。现在我终于得到了所需的
    true
    作为验证结果。
    references:<1500037364.788302144@mx47.mail.ru>
    in-reply-to:<1500037364.788302144@mx47.mail.ru>
    content-type:multipart/mixed; boundary="----uEhsLqzDWmmGeA9EZ3XNsqSIGjlgVTmA-NI9QMhpqxNHWLEDT-1501324242"
    message-id:<1501324242.448202607@f427.i.mail.ru>
    reply-to:=?UTF-8?B?0KHQtdGA0LPQtdC5?= <[my name]@mail.ru>
    date:Sat, 29 Jul 2017 13:30:42 +0300
    mime-version:1.0
    subject:=?UTF-8?B?UmU6IA==?=
    to:madbr@[domain]
    from:=?UTF-8?B?0KHQtdGA0LPQtdC5?= <[my name]@mail.ru>
    
    dkim-signature:v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mail.ru; s=mail2; h=References:In-Reply-To:Content-Type:Message-ID:Reply-To:Date:MIME-Version:Subject:To:From; bh=gCWDSCJf58CbaR+wjAV9dydu9JTKkvo1o+0zkj8bNr0==;
    
    crypto.createVerify('sha256')
        .update(header + dkimHeader)
        .verify(publicKey, Buffer.from(signature.b, CONST.BASE64));
    
    dkim-signature:v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mail.ru; s=mail2; h=References:In-Reply-To:Content-Type:Message-ID:Reply-To:Date:MIME-Version:Subject:To:From; bh=gCWDSCJf58CbaR+wjAV9dydu9JTKkvo1o+0zkj8bNr0=; b=;