DKIM 签名公钥在 DNS 中找不到 "key not found" 怎么解决?
DKIM 签名公钥在 DNS 中找不到 "key not found" 怎么解决?
问题原因:DKIM 验证方收到邮件后,从 DKIM-Signature 头提取 d= 标签(签名域)和 s= 标签(选择器),构造 DNS 查询
selector._domainkey.example.com 获取 TXT 记录中的公钥。若此 DNS 查询返回 NXDOMAIN 或空结果,验证方返回 key not found(等效于 permfail)。Step 1 — 确认选择器名称:查看已发送邮件中的 DKIM-Signature 头,提取 s= 标签值(如
s=202501)。DKIM 签名头示例:DKIM-Signature: v=1; a=rsa-sha256; d=example.com; s=default; h=from:to:subject; bh=...; b=...。此处 s=default 即为选择器。Step 2 — 手动验证 DNS 记录:运行
dig txt default._domainkey.example.com +short,期望返回类似 "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQ..." 的记录。若返回空或 SERVFAIL,则 DNS 配置有问题。建议同时指向公共 DNS 验证外部可见性:dig txt default._domainkey.example.com @8.8.8.8 +short。Step 3 — DNS 传播延迟:新添加或修改的 TXT 记录受 TTL 和 DNS 层级缓存影响,可能需要 1-48 小时才能全球生效。如果刚发布公钥就立即测试,部分验证方可能还查不到。先用 MXToolbox DKIM Checker 分区域测试传播状态。
Step 4 — 公钥 TXT 记录截断问题:2048 位 RSA 公钥的 base64 编码长度约 400 字符,远超单个 TXT 记录 255 字符限制。需要在 DNS 管理面板中拆分为多个引号段,如
"v=DKIM1; k=rsa; p=MIGf...ABC" "DEF...xyz"。部分 DNS 管理面板不能自动拆分——此时 copypaste 完整公钥会导致记录被截断。验证公钥长度:dig txt default._domainkey.example.com +short | tr -d ' "' | wc -c,2048 位密钥预期 350-400 字符。Step 5 — 子域名 _domainkey 前缀检查:DKIM 完整查询域名为
{selector}._domainkey.{domain},不是 {selector}.{domain}。如果发件域为子域(如 mail.example.com),DNS 记录必须在 selector._domainkey.mail.example.com 而非 selector._domainkey.example.com——DKIM 的 d= 标签指向哪个域,公钥就放在哪个域的 _domainkey 子域下(RFC 6376 §3.6.1)。📎 RFC 6376 §3.6.2 DKIM DNS 记录格式;RFC 6376 §3.6.1 密钥存储
