什么是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...
关键字段:
- d=:签名域
- s=:选择器(用于查找DNS记录)
- h=:签名中包含的头
- b=:实际签名
- bh=:正文哈希
设置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通过指定如何处理未签署的消息来解决这个问题。