作为兼职 admin,经历了几次配置 Email Authentication 的过程,发现每做一次的时候、上一次的经验已经基本忘光了。还是记一笔吧,好记性不如烂笔头。
Email Authentication 的作用
Email Authentication 是一套基于 DNS(域名系统)的底层协议,旨在解决电子邮件发明初期的一个核心缺陷:SMTP(简单邮件传输协议)默认不验证发件人的身份,这导致任何人都可以在发件人一栏伪造你的域名。
为了防御垃圾邮件、钓鱼攻击并提升邮件投递率,SPF,DKIM,DMARC 和 BIMI 这四项技术互为补充,形成了一个完整的防御链条。
注意这四个协议都是围绕着 DNS Records 展开的,所以配置的时候也要在你 domain 的 DNS service provider 那里进行。
SPF (Sender Policy Framework)
一句话解释
SPF 是在 DNS 记录中列出所有获得授权、可以代表你的 domain 发送 email 的服务器 IP 地址的一条 TXT 记录。
一个例子:
v=spf1 ip4:192.0.2.0/24 ip4:198.51.100.123 a -all
构成:
- Version:v=spf1 是目前的唯一有效值。
- Mechanisms
- ip4/ip6:指定具体的 IP 地址或网段。
- a:授权当前域名的 A 记录。
- mx:授权当前域名的 MX 记录
- include:引用另一个域名的 SPF 记录。常用于第三方服务,如 include:_spf.google.com。
- exists:检查特定的域名是否存在。
- Qualifiers:每个 mechanism 前面的前缀修饰符,决定匹配时的判定结果。省略不写时默认为 +(Pass)。以下以 all(匹配所有)为例:
- -all (Fail): 强拒绝。告诉收件方,如果不匹配就直接拒收(最严格)。
- ~all (SoftFail): 软拒绝。告诉收件方,如果不匹配,请接收但标记为疑似垃圾邮件(最常用,容错率高)。
- ?all (Neutral): 中立。不做任何判定。
- +all (Pass): 全通。允许任何服务器发信(极度危险,千万别用)。
查询方法:
dig txt example.com +short | grep spf
DKIM (DomainKeys Identified Mail)
一句话解释
DKIM 为邮件内容添加一个不可见的数字加密签名。发信服务器用私钥对邮件头和正文签名;收信服务器去 DNS 查你的公钥(包含在一个 TXT 的 DKIM 记录中)。如果签名能对上,说明邮件在传输过程中没有被篡改,且确实来自你的域名。
一个例子:
v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtOzIjTYVUYZDbm03lsL4MGxSUVJWALTSueNRnCvCdM5d0i26EVUH7jprqIFdBSnMXQDHCkwcH1bFjtbfHCzFfWlpzOWducPPU0E+ut0rRqIy4NKY8CJlW39Q+AHJ70h+k2VadmQt0A1Yijg/Dk73NuJAz8KDNgz2x14nDVkINRlynAU7EosarRRhVGKqlNrYdp/os6QYaetfYNdQRJDecOARNObGRET/sW0m5Ya5SBGsaw8VSGluCwSZh+zShTXaOyA1WnpHNtAoCQClFPn9vmm6Cb0Z2gYF0g/+qZ1FCnaj1+aaJGzhqVOXGtHGWM3dLpwC7Rul6STfFD521JeqpQIDAQAB
构成:
- v= (Version):v=DKIM1 是目前的唯一有效值。
- k= (Key type):默认为 rsa,现代系统也开始支持 ed25519。
- p= (Public-key data):经过 Base64 编码的公钥内容。
- h= (Acceptable hash algorithms):如 sha1 或者 sha256。
- s= (Service Type):可选,通常为 * 或 email。
- t= (Flags):可选,例如 t=y 表示处于测试模式。
- n= (Notes):可选,人类可读的备注。
DKIM 的实现分成两部分,上面 DNS 记录里的公钥以及发件服务器上的私钥,和邮件头里的 DKIM-Signature。
一个例子:
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774848665; x=1775453465; dara=google.com; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=o6Z+SMxBboMX1BthWuCxMAtw9xjGC/+V/mmsl1QfJoY=; b=Y1/TdHMrtWknMINw237KxL3ehZEPrp1plnQ2HEHQIvF+sHQdz+NM03KhHcIeo5KEuk iwy9u0Gy0NyCFrtFpZ56Z6l49PvugjFLDNpQc/YWXKzlgfjAz+rsKWjVaaRjMXrJnsz1 8yxfvDwN4Jz8y/pJ9dCSo6D4zkzcn9kknNVZph+oP7VG2hhF6zZODvwNBIRe/Aa5ZbHr +O4POjMMKpAO9A9WvfSzIlSe36M9ivq9X8ynqPAqsjU1TOMEgKryZWjf/JhtdinFXBfr eV/KiaFp9IgP90utdQ6FTIkrE/xbGOSaSgldJj3h8K7fU3Hl8zs0BFcQXhDeNeRanQPI jsTQ==
注意:上例中的
dara=是 Google 的私有扩展标签,不属于 DKIM 标准(RFC 6376)。
构成:
- v=1:版本号。
- a= (Algorithm):签名算法,常用 rsa-sha256。
- d= (Domain):发送者的域名,用于在 DNS 中查找公钥。
- s= (Selector):选择器,配合 d 标签定位具体的 DNS 记录(因为一个域名可能有多个 DKIM 密钥)。
- c= (Canonicalization):规范化算法(通常是 simple 或 relaxed)。由于邮件传输过程中可能会被中继服务器稍微修改格式(如增减空格),relaxed 模式允许忽略这些微小差异,防止验签失败。
- h= (Headers):被包含在签名范围内的邮件头列表(如 from, to, subject)。如果这些内容被篡改,签名将失效。
- bh= (Body Hash):邮件正文的哈希值。
- b= (Signature Data):对 h 标签列出的头部内容以及 bh 进行数字签名后的最终数据。
查询方法:
dig txt 20251104._domainkey.gmail.com +short
注意,DKIM 不是挂在根 domain 上,而是挂在 <selector>._domainkey.<domain> 上,所以必须知道 selector 才能查询。selector 可以从邮件头的 DKIM-Signature 里找到。
DMARC (Domain-based Message Authentication, Reporting, and Conformance)
一句话解释
DMARC 是电子邮件安全体系中的“决策层”。它不直接执行验证,而是告诉收件服务器,如果前面的 SPF 或 DKIM 验证失败了,该如何处理这封邮件。这就提供了反馈机制(Reporting),让域名所有者知道谁在冒用自己的名义发信。
一个例子:
v=DMARC1;p=reject;sp=reject;adkim=s;aspf=s
构成:
- v= (Version):v=DMARC1 是目前的唯一有效值。
- p= (Policy):最重要的标签。定义当邮件未通过验证时的处理策略。
- none:监控模式。不对邮件进行拦截,照常接收,仅发送审计报告。适用于部署初期。
- quarantine:隔离模式。将邮件放入收件人的“垃圾邮件”文件夹。
- reject:拒绝模式。直接拒收邮件,邮件无法送达。
- rua= (汇总报告地址):可选,接收每日汇总报告的邮箱,用于查看整体通过率。如:rua=mailto:[email protected]。
- ruf= (失败详情报告):可选,接收每封验证失败邮件的详细报告(包含邮件头信息)。如:ruf=mailto:[email protected]。
- pct= (策略应用比例):可选,规定该策略应用在多少比例的邮件上(0-100)。如:pct=50 (仅处理50%邮件)。
- sp= (子域名策略):可选,为子域名(如 sub.ex.com)定义不同于主域的策略。如:sp=reject。
- adkim= (DKIM 对齐模式):可选,s (Strict): 域名必须完全一致;r (Relaxed): 允许子域名匹配。如:adkim=s。
- aspf= (SPF 对齐模式):可选,同上,控制 SPF 验证时的域名匹配严格程度。如:aspf=r。
查询方法:
dig txt _dmarc.example.com +short
位置通常是 _dmarc.<domain>。
BIMI (Brand Indicators for Message Identification)
一句话解释
在 DMARC 设置为严格模式(拒绝或隔离)的前提下,BIMI 允许你在收件人的收件箱里直接显示经过认证的品牌 Logo。从而提高品牌辨识度,同时向用户证明这封邮件是 100% 真实可信的。
一个例子:
v=BIMI1;l=https://www.apple.com/bimi/v2/apple.svg;" "a=https://www.apple.com/bimi/v2/apple.pem;
构成:
- v= (Version):v=BIMI1:版本标识,必须位于开头。
- l= (Location):Logo 的 URL 地址。必须是 HTTPS 连接,且图片必须是经过特定规范化的 SVG 格式。
- a= (Authority):验证实体证书 (VMC) 的 URL。
- VMC(Verified Mark Certificate)是由受信任的证书颁发机构(如 DigiCert, Entrust)签发的数字证书,证明你拥有该商标。
- 虽然技术上可以留空(a=;),但目前大多数主流邮箱(如 Gmail, Apple Mail)强制要求必须有 VMC 证书才能显示 Logo。
配置 BIMI 记录本身很简单,但要让它生效,你的域名必须满足以下条件:
- DMARC 必须处于强力保护模式:
你的 DMARC 策略必须设置为 p=quarantine(且 pct=100)或者 p=reject。如果策略是 p=none,BIMI 不会生效。 - SVG 格式限制:
普通的 SVG 不行,必须是 SVG Tiny PS (Portable Secure) 格式(SVG Tiny 1.2 的一个受限子集),且不能包含脚本、外部链接或交互元素。 - 商标注册:
要获得 VMC 证书,你的 Logo 必须是在官方机构(如美国 USPTO)注册过的图形商标。
查询方法:
dig txt default._bimi.apple.com +short
位置通常是 default._bimi.<domain>。