0

我正在用 Node.js 编写自己的 DKIM 实现,但在让我的 DKIM 通过时遇到问题。

这是我的邮件正文:

dGVzdA==\r\n

这是正文哈希(sha256):

STFhz2ITzV8iSPWgLK0kfUa69jvk327MHRw2ZpGDvWE=

这是我的 dkim 标头哈希输入:

来自:test@test.test.org\r\ndkim-signature:v=1;a=rsa-sha256;c=relaxed;s=wo8vy2th;d=test.test.org;h=来自;bh=STFhz2ITzV8iSPWgLK0kfUa69jvk327MHRw2ZpGDvWE= ;b=

然后我使用以下代码签名:

crypto.createSign('rsa-sha256').update(headerHash).sign({key: processItem.sharedData.dkim_private_key, passphrase: dkimDomainKeyPassphrase}, 'base64');

然而,在抵达时我得到 dkim=fail。我的 DNS _domainkey 确实解析正确。

请注意,对于此示例,我仅使用 From: 标头来尝试查找问题。实际上,我将使用所有推荐的标题。

编辑:这是失败的原始电子邮件来源:

Delivered-To: wyatt5@ethereal.email
Return-Path: <test@test2.cybermancy.org>
Authentication-Results: mx.ethereal.email; spf=permerror smtp.mailfrom=test2.cybermancy.org; dkim=fail header.i=@test2.cybermancy.org
Received-SPF: PermError (mx.ethereal.email: domain of test2.cybermancy.org does not designate 67.205.181.191 as permitted sender) receiver=mx.ethereal.email; identity=mailfrom; client-ip=67.205.181.191; helo=mta.postagent.io; envelope-from=<test@test2.cybermancy.org>
Received-SPF: None (mx.ethereal.email: domain of mta.postagent.io does not designate 67.205.181.191 as permitted sender) receiver=mx.ethereal.email; identity=helo; client-ip=67.205.181.191; helo=mta.postagent.io; envelope-from=<test@test2.cybermancy.org>
Received: from mta.postagent.io ([67.205.181.191])
    by mx.ethereal.email (Haraka/2.8.23) with ESMTP id A08331BF-93B5-41C1-ADBA-B7B0F9DEF1CF.1
    envelope-from <test@test2.cybermancy.org>;
    Fri, 17 Jan 2020 14:18:12 +0100
Message-ID: <23e18f92-e6f3-4fab-bfa3-649584bec5b4+1579267090958@mta.postagent.io>
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed; s=wo8vy2th;        
    h=mime-version:from:to:date:subject;        
    d=test2.cybermancy.org;        
    bh=STFhz2ITzV8iSPWgLK0kfUa69jvk327MHRw2ZpGDvWE=;        
    b=RH/CNjqKlOcLEuwT8zCEo2k0UyDDAlCfsEVkPBU83pbNNDNxVMUVDQmHsxjPUw/GLm0osY948u1YhUIC8clAfUdaaVQqHfWXDmuk24t+uaeHLwQu/dTRuLJfFjO+lXlnx4VFNxQHj3kBAWJ6/aNhO5kq3QI7u7uGWtGf+4pZzg8=
To: wyatt5@ethereal.email
From: test@test2.cybermancy.org
Subject: test subject
Date: Fri, 17 Jan 2020 13:18:10 +0000
X-report-abuse: Please forward a copy of this message, including all headers, to abuse@test.org
Mime-Version: 1.0
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: base64

dGVzdA==

注意:我已经尝试过折叠和不折叠的签名值。对于这个例子,我没有折叠它。

这是我的标头哈希输入:

mime-version:1.0\\r\\nfrom:test@test2.cybermancy.org\r\nto:wyatt5@ethereal.email\r\ndate:Fri, 17 Jan 2020 13:18:10 +0000\r\nsubject:test subject\r\ndkim-signature:v=1;a=rsa-sha256;c=relaxed;s=wo8vy2th;d=test2.cybermancy.org;h=mime-version:from:to:date:subject;bh=STFhz2ITzV8iSPWgLK0kfUa69jvk327MHRw2ZpGDvWE=;b=

DKIM 选择器:wo8vy2th DKIM 公钥,位于 wo8vy2th._domainkey.test2.cybermancy.org

k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7V0yupUNowYt7ciprmmn3s2sQkQA8cI7LVywrTwAOAS1RMAAcPRGIO0By/XHlh8uTMf0Kw+GscrHRz90TUJpRdDx9lCKCwUE6taWVsdsgUPmpJ1AxHDCrmbadFdjsc0hNTCt8niNsmph8qiV/6T6Qjtt/4piVlxKxzLPIJn976QIDAQAB

编辑2:

这是我用 JSON.stringify() 打印的私钥:

"-----BEGIN ENCRYPTED PRIVATE KEY-----\nMIIC3TBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQIb03M5gGl7LECAggA\nMAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBCag7vzzjSCpDbgd9m2qci1BIIC\ngF2BIPWvOYMREJcbfs8JF3TAyUsuY6rXjW4ff3GPNqOHw8k45JCejSwOpHA1xgK8\n1jLVHf8kdhjCPqw9S9+l6GT59VXQqmFXKte5gTSwgOHz1Vy+fsH7OLZpPlxAhDFX\nXoyGBLAOnRUQ25Jl9eSEZ2Zs20L0Qd0XJL3MITWzTmHql+MpnZFkNW9mRZuhJ//j\nWmjJ7MTmDe6dhG5CYs2wS8cYET4z9tltDVBk287gwyMzg9dNdvbu2vvihvjiN3r6\ndYwH81ILDUoi6TFZeItjZVRk1wrDXemDhP4WWtWYA5fIMW/DDXjWSlja6aytfSAy\nzcZJMDYKhu8XGBYffFoG/3vP4Nbv8J9+XlQ0Av9LnHG1OjDpdFAaYOgwl7Cv2lWt\n0agNFrsaVgU4lkuBF9UMJp9QySsRmSb/pIIpUp/KvA7GpSmRyXc+MGgOMdekh+Tp\n52i+0y/2DYMrlfCRiLu5mOs5Ks6UN5W80TBQdwnB+vM2/0DYkemQCocQqdmc0aZB\nvGnsriqbmhZLbHL79DlqFyJ+HB5j8WzjNUHO+LF2aBAbu92y2t6P6BDBlzsauu0D\ndvdiMiLh7ifzIkWWHsGMGng5FM+xsv/fQIZNDjjCT1Anb29BywneFZjBc0cghvw7\nbqAnwO4HJLXocDQIfWu9gmjsjodLfTzPBS622Qnu1J0HXMvasY7IBopVWfKncT6u\nkzd68EN0QyPeWgh3wQTOpwoakjTsorIGJ+Ph+AhemH3V1jhQchjtPbxxqU7QU1NG\nQBZn/YPkiQYSk23G5QbYdHNzOrTMI9DGsdqukArUo+HMv2viTbRDqPcEa3MEd0Rq\n67kB7QutXMLsv/S36UioBbg=\n-----END ENCRYPTED PRIVATE KEY-----\n"

加密后的私钥密码为:

nkwsrcdk7gaah4vl7h0fdd1xjssefyibtyftyfjd98ewjmfnkisjt5t5jjjdfghgfdsrtyurtyu

4

2 回答 2

0

s您创建的签名crypto.createSign()应立即通过以下方式验证:

    crypto.createVerify('RSA-SHA256').update(ch, 'binary').verify(pk, s, 'base64');

规范化的标头在哪里ch,并 pk 你的公钥(用'-----BEGIN PUBLIC KEY-----\n'OpenSSL 装饰并类似于它)。我尝试使用上面给出的标题哈希输入,在第一个标题字段之后有和没有双反斜杠。我还尝试使用从上述消息中获得的规范化标头:

    ch = 'mime-version:1.0\r\nfrom:test@test2.cybermancy.org\r\n' +
         'to:wyatt5@ethereal.email\r\n' +
         'date:Fri, 17 Jan 2020 13:18:10 +0000\r\nsubject:test subject\r\n' +
         'dkim-signature:v=1; a=rsa-sha256; c=relaxed; s=wo8vy2th;' +
         ' h=mime-version:from:to:date:subject;' +
         ' d=test2.cybermancy.org;' +
         ' bh=STFhz2ITzV8iSPWgLK0kfUa69jvk327MHRw2ZpGDvWE=;' +
         ' b=';

在任何情况下都没有验证签名。因此,您在上面提供的数据中有问题。

您必须严格遵循规范化说明,以便签名者和验证者获得相同的 blob。

于 2020-01-18T17:40:03.803 回答
0

而且您确实拥有在 DNS 记录中发布的签名密钥的公钥: wo8vy2th._domainkey.test.test.org ?

这要求您有权访问 test.org DNS 区域。

DKIM 签名需要域密钥 - 这是验证签名的唯一方法。

你读过 RFC 6376 吗?一件事是必须对 CR+LF 进行编码。查看 3.4.3 并查看空主体是否获得正确的 sha-256:(对于 c=relaxed)

47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=

尝试使用传入的 DKIM 验证邮件作为数据输入来重新创建哈希值,以验证您的计算。在已知的好邮件上测试您的散列/放松/简单应该是微不足道的。说从 gmail 发送给自己

于 2020-01-17T08:43:58.137 回答