如何构建DKIM头部?哈希前DKIM头与体格式化方法咨询
DKIM签名前的头部与正文格式化指南
嘿,刚好在DKIM签名这块踩过不少坑,给你梳理下签名前必须严格遵守的格式化(也就是DKIM里的「规范化Canonicalization」)规则,这直接决定了签名能不能被收件方验证通过!
一、邮件头部的规范化
DKIM支持两种头部规范化模式,你需要根据需求选择,并且要把模式声明在最终的DKIM-Signature字段的c参数里(比如c=relaxed/simple表示头部用relaxed,正文用simple):
Relaxed模式(最常用,容错性高)
- 把所有头部字段名转换成小写(比如
From:变成from:) - 字段名和值之间的分隔符必须是「单个冒号+单个空格」,如果原始是多个空格或者没有空格,要统一成这个格式
- 字段值里的**连续空白(空格、制表符、换行折叠)**合并成单个空格,同时去掉字段值首尾的空白
- 保留头部字段的原始顺序,绝对不能调整顺序(比如不能把Date放到From前面)
Simple模式(严格保留原始格式)
- 几乎保留头部的原始内容,只做两个调整:
- 把所有换行统一转换成标准的CRLF(
\r\n) - 去掉头部最后可能存在的多余空白行
- 把所有换行统一转换成标准的CRLF(
- 注意:字段名的大小写、值里的空格都要原样保留,适合对原始格式要求极高的场景
⚠️ 重要提醒:DKIM-Signature这个字段本身绝对不能包含在你要签名的头部集合里,它是签名完成后才添加到邮件头部的!
二、邮件正文的规范化
同样支持两种模式,和头部模式可以自由组合:
Relaxed模式
这是大多数邮件服务商推荐的模式,步骤如下:
- 把正文里所有的换行符(不管是LF
\n、CR\r还是CRLF\r\n)统一转换成标准的CRLF - 去掉每一行末尾的所有空白(包括空格、制表符)
- 把正文里的**所有连续空白(包括换行、多个空格)**合并成单个空格
- 如果处理后的正文非空且没有以CRLF结尾,要追加一个CRLF;如果处理后正文为空,就不用加
Simple模式
这种模式更严格,尽量保留正文原始内容:
- 把所有换行符统一转换成CRLF
- 如果正文末尾有一个或多个CRLF,只保留最后一个;如果正文没有以CRLF结尾,要追加一个
- 其他内容完全保留,包括空格、制表符等
最后几个关键细节
- 所有操作都要基于邮件的原始字节流,不要随意转码(比如不要把UTF-8转成ASCII,除非原始邮件就是ASCII编码),否则签名会失效
- 签名时一定要在
DKIM-Signature里明确声明你用的规范化模式,比如c=relaxed/relaxed是最常见的组合 - 测试时可以用收件方的DKIM验证工具来排查问题,我当初就是因为没注意relaxed模式下的空白合并,踩了好多次坑!
内容的提问来源于stack exchange,提问作者skywa04885
相关产品推荐
相关产品推荐

