这篇文章系统记录了我对于DKIM协议的RFC-6376文档阅读,记录一些我认为重要的关键点和相关问题。
关注RFC文档中的MUST SHOULD
rfc文档要点
- 0 签名验证失败不强制拒绝消息
- 1.2 信息性原理:DKIM签名指定的签名标识不需要匹配任何特定头字段中的地址,因为收件人邮件系统(包括MUAs)有广泛的解释方法。
- 3.2 不能在标记值中出现未编码的分号(“;”)字符,因为这会分隔标记规范。
- 3.2 标签必须以区分大小写的方式解释。值必须作为区分大小写的处理,除非语义的特定标记描述指定区分大小写。
- 3.5 电子邮件的签名存储在DKIM-Signature头字段中。DKIM-Signature值是一个标记列表,如第3.2节所述。所创建或验证的DKIM-Signature头字段总是包含在签名计算中,在其余头字段被签名之后;但是,在计算或验证签名时,必须将DKIMSignature头字段的“b=”标记(签名值)的值视为空字符串。签名中包含的其他DKIM-Signature头字段应视为普通头字段;
- 3.5 v -> 版本号 当前版本一定具有值”1”. REQUIRED
- 3.5 a -> 签名计算使用的加密算法 验证器必须支持“rsa-sha1”和“rsa-sha256”;签名者应使用“rsa-sha256”进行签名。REQUIRED
- 3.5 c->通知验证者用于准备消息签名的规范化类型
- 3.5 d - 签名者的域名。此部分与DMARC一起使用,以检查签名域是否与邮件客户端中可见的发件人域匹配 REQUIRED
- 3.5 h - 签名中需要包含的邮件头部的字段列表 标题字段名称必须以不区分大小写的方式与实际的标题字段名称进行比较。这个列表不能为空。REQUIRED
- 3.5 bh body hash 邮件正文部分的哈希值 REQUIRED
- 3.5 s selector 选择器名称 REQUIRED
- 3.5 b 整体hash值 包含用’h’给出的头字段,以及DKIM-Signature头本身,因此也对正文进行签名,因为bh包含正文散列。 REQUIRED
- 3.5 l 用于计算哈希值的邮件正文的长度。这是可选的,如果没有默认为全部正文。
- 3.5 q 用于检索公钥
- 3.6 键查找算法的参数包括查找的类型(“q=”标记)、签名者的域(DKIM Signature头字段的“d=”标记)和选择器(“s=”标记)。
- 3.6.2.2 TXT RRs MUST be unique for a particular selector name.一个选择器下只能有一条记录。
- 3.7 签名者/验证者必须计算两个哈希值:一个是邮件正文,另一个是被发信人选择的头部字段。
- 3.7 当计算将使用base64或引用打印编码传输的消息的散列时,签名者必须在编码之后计算散列。
- 5.4 强烈建议在消息中显示签名字段,如日期、主题、回复、发送方和所有MIME头字段。Date, Subject, Reply-To, Sender, and all MIME header fields
- DKIM-Signature头字段始终是隐式签名的,并且必须不包含在“h=”标记中,除非指示其他预先存在的签名也被签名。签名者可能声称拥有不存在的已签名头字段(也就是说,即使消息中不存在头字段,签名者也可能在“h=”标记中包含头字段名)。在计算签名时,必须将不存在的头字段视为空字符串(包括头字段名称、头字段值、所有标点符号和后面的CRLF)。
- 5.4 在消息签名时,头字段名只需要比消息中该头字段的实际数量多列出一次,以防止任何进一步的添加。
- 5.4 尽管本规范不要求,但所有终端用户可见的头字段都应该签名,以避免可能的“间接垃圾邮件”。例如,如果主题标题字段没有签名,垃圾邮件发送者可以重新发送之前签名的邮件,用一行垃圾邮件替换合法的主题。
- 5.4.1 DKIM密码算法的目的是为消息添加一个标识符,该标识符既能抵抗正常的传输相关更改,又能抵抗各种重播攻击。满足这些要求的一个基本方面是选择要在散列中包含哪些头字段,以及要排除哪些字段。选择要包含的字段的基本规则是选择那些构成消息内容“核心”的字段。因此,任何重播攻击都必须包含这些攻击,以便签名成功;但是,包含了这些之后,即使将消息发送给新的收件人,消息的核心也是有效的。
- 5.4 The DKIM-Signature header field is always implicitly signed and MUST NOT be included in the “h=” tag except to indicate that other preexisting signatures are also signed.
ADSP(Author Domain Signing Policies)
当邮件接收者收到一个没有签名的邮件时,应该怎么办呢。这个时候就要看ADSP的设置了。
我们可以在DNS中添加一个新的TXT记录,名称是“_adsp._domainkey”,值是“dkim=all”。
“dkim=”后可有三个可选值:
unknow: 意思是从这个域发出的邮件可带DKIM证书,也可不带。
all: 意思是从这个域名发出的证书都应该带DKIM证书的。
discardable: 意思是强烈建议接收邮件的对端把没有DKIM证书或DKIM验证失败的邮件丢弃掉。
相关思考
记录更新是否会带来旧邮件丢失的问题 是否只增不删