DKIM(DomainKeys识别邮件)

电子邮件和安全
电子邮件身份验证方法,为传出电子邮件添加数字签名,允许接收方验证消息未被更改。
← 返回词汇表

什么是DKIM?

DKIM(域名密钥标识邮件)是一种电子邮件身份验证方法,允许发送服务器对传出消息进行数字签名。接收服务器随后可以使用在DNS中发布的公钥验证此签名,确认电子邮件在传输中未被修改并确实来自声称的域。

DKIM的工作原理

1. 密钥生成:域所有者生成公/私密钥对

2. DNS发布:公钥作为TXT记录发布

3. 邮件签名:传出电子邮件用私钥签名

4. 签名验证:接收服务器检索公钥并验证签名

签名过程

当发送电子邮件时:

1. 邮件服务器计算邮件头和正文的哈希

2. 哈希用私钥加密(创建签名)

3. 签名作为DKIM-Signature头添加

4. 电子邮件被传输

验证过程

当接收电子邮件时:

1. 服务器提取DKIM-Signature头

2. 找到选择器和域(s=selector; d=domain.com)

3. 查询DNS获取selector._domainkey.domain.com TXT记录

4. 使用公钥解密签名

5. 计算邮件的自己的哈希

6. 比较:匹配=通过,不匹配=失败

DKIM记录格式

DKIM记录是特定子域处的TXT记录:

selector._domainkey.example.com.    IN    TXT    "v=DKIM1; k=rsa; p=MIGfMA0..."

记录组件

标签描述示例
v版本v=DKIM1
k密钥类型k=rsa
p公钥(base64)p=MIGfMA0GCSqG...
t标志(可选)t=y(测试模式)
h哈希算法h=sha256

选择器

选择器允许每个域的多个DKIM密钥:

google._domainkey.example.com       # Google Workspace

s1._domainkey.example.com # Sendgrid

mailchimp._domainkey.example.com # Mailchimp

每个电子邮件服务提供自己的选择器和密钥。

DKIM签名头

DKIM签名看起来像:

DKIM-Signature: v=1; a=rsa-sha256; d=example.com; s=google;

c=relaxed/relaxed; q=dns/txt;

h=from:to:subject:date:message-id;

bh=2jUSOH9NhtVGCQWNr9BrIAPreKQjO6Sn7XIkfJVOzv8=;

b=AuUoFEfDxTDkHlLXSZEpZj79...

关键字段:

设置DKIM

对于Google Workspace

1. 转到管理控制台→应用→Gmail→身份验证电子邮件

2. 生成DKIM密钥(建议2048位)

3. 添加Google提供的TXT记录

4. 激活DKIM签名

对于第三方服务

大多数电子邮件服务(SendGrid、Mailchimp等)提供:

1. 一个CNAME记录添加(用于他们的托管密钥)

2. 或一个包含公钥的TXT记录

示例(SendGrid):

s1._domainkey.example.com    CNAME    s1.domainkey.sendgrid.net

验证DKIM

发送测试电子邮件到显示头的服务(Gmail显示身份验证结果)。 使用命令行
dig google._domainkey.example.com TXT
使用DomScan
curl "https://domscan.net/v1/health?domain=example.com"

# 根据常见选择器报告DKIM状态

DKIM最佳实践

使用2048位密钥

较旧的1024位密钥变得越来越易受攻击。大多数提供商现在默认为2048位。

定期轮换密钥

每年轮换DKIM密钥或在安全事件后。在切换前使用新选择器发布新密钥。

签署重要头

确保From、To、Subject、Date和Message-ID包含在签名中。

不要修改签署的消息

邮件列表或转发服务修改内容会破坏DKIM。对转发的邮件使用ARC(认证接收链)。

DKIM限制

DKIM单独并不防止欺骗——它只证明消息未被篡改。域可以有有效DKIM,同时攻击者发送未签署的欺骗电子邮件。DMARC通过指定如何处理未签署的消息来解决这个问题。

将知识付诸实践

使用 DomScan 的 API 检查域名可用性、健康状态等。