首页 > 解决方案 > 当标题“h”标签展开为 2 行时,DKIM 签名失败

问题描述

我正在用 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 签名及其特殊情况有经验。

标签: dkim

解决方案


请注意,您发布的 DKIM 标头不完整(缺少 bh 和 b 标签)。

但是您在其中添加空格的 DKIM 标头的第二次(宽松)规范化...:to :cc;...应该是正确的。如果仍然无法验证,请仔细查看其余已签名的标头。也许还有另一个错误。


展开本身不会删除除 CRLF 之外的任何空格。来自https://www.rfc-editor.org/rfc/rfc5322#section-2.2.3

展开是通过简单地删除紧随 WSP 的任何 CRLF 来完成的。

所以在unfloding之后,你就剩下了...:to :cc;...

在下一步中,根据https://www.rfc-editor.org/rfc/rfc6376#section-3.4.2将其缩减为一个空格

将一个或多个 WSP 字符的所有序列转换为单个 SP 字符。


推荐阅读