我正在用Java编写电子邮件DKIM签名验证程序。我的问题是特例:
1 –创建主体哈希没有任何问题。我的问题是在对规范化的标头进行签名。
2 –我使用gmail帐户创建测试电子邮件,并且在许多情况下可以正确验证其标头签名。但是只有某些特殊情况会失败。我做了很多测试,当DKIM-Signature头中的h标签有2行时,签名验证失败。
这是标头失败的示例:
...
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
d=gmail.com; s=20161025;
h=mime-version:references:in-reply-to:from:date:message-id:subject:to
:cc;
...
为澄清起见,我想我的问题在这里:
h=mime-version:references:in-reply-to:from:date:message-id:subject:to
:cc;
每次将“ h”标签展开到2行时,验证均失败。我熟悉行展开规则,并且可以正确验证在其他位置展开的标头的签名。
标头标准化后,应验证签名的内容为:
...
dkim-signature:v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to:cc; bh=pr1Zv1pbjuW/HrdQ6zZ5mYq51Bi+uidXLGOQ265rvEs=; b=
我测试了许多修改签名内容的场景,希望能够正确验证,包括在行折叠位置插入一个“空格”,使签名内容变为:
... h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; ...
我知道我的问题很具体。但是希望有人在DKIM签名及其特殊情况方面有经验。
答案 0 :(得分:0)
请注意,您发布的DKIM标头不完整(缺少bh和b标签)。
但是您在...:to :cc;...
中添加了空格的DKIM标头的第二个(松弛)规范化应该是正确的。如果仍然无法验证,请仔细查看其余已签名的标头。也许还有另一个错误。
展开本身不会删除CRLF之外的任何空白。来自https://tools.ietf.org/html/rfc5322#section-2.2.3
只需删除任何CRLF即可完成展开 然后是WSP。
因此,在解决问题之后,您将得到...:to :cc;...
下一步,将其缩小为单个空格, 按照https://tools.ietf.org/html/rfc6376#section-3.4.2
将一个或多个WSP字符的所有序列转换为单个SP字符。