FAQ问答 > DKIM 签名验证报 'body hash did not verify',常见原因是什么?

DKIM 签名验证报 'body hash did not verify',常见原因是什么?

此错误表示收件方 MTA 在验证 DKIM(RFC 6376 §4.7)签名时,计算的正文 bh=(body hash)与签名中的 hash 值不一致。常见原因如下:

原因 1:MTA 修改了邮件正文

邮件网关、反垃圾设备或邮件列表管理器修改了正文(添加页脚、重写 HTML 链接、追加追踪像素)。签名后任何字节的改动都会导致 bh hash 不匹配。参考 RFC 6376 §8.4 签名规范,正文采用 WSP 宽松规范化

原因 2:规范化算法不一致

发件方 MTA 使用 c=relaxed/relaxed(正文行尾归一化为 CRLF),但收件方解析器以 c=simple/simple 验证(CRLF 不做归一化)。要求双方 DKIM 实现必须使用相同的规范化算法。

原因 3:编码转换导致

Base64 编码的 body hash 在传输中被邮件网关重排(EAI/RFC 6531 中文编码场景)。检查 mail log 中的 DKIM 验证行:

# Postfix/Dovecot 下检查 DKIM 验证日志
grep "dkim" /var/log/maillog | grep -i "body hash"

# OpenDKIM 测试验证
opendkim-testmsg --verify /tmp/email.eml

参考文献

  1. RFC 6376 §4.7