错误信息
dkim=permerror
也可能输出为
- dkim=neutral (signature syntax error)
OpenDKIM 只写一个不带原因的 `dkim=permerror`(我们用缺少 `bh=`、带 `v=2`、带未知 `a=` 以及 `i=` 不在 `d=` 内的签名复现过)。mailauth 把语法问题报告为 `dkim=neutral`,并附上指明问题的注释;无法具体指明时则使用“signature syntax error”。
含义
DKIM 签名根本无法评估,重试也无济于事:`DKIM-Signature` 头的语法有误,或违反了 RFC 6376 的规则(缺少 `bh=` 或 `b=` 等必需标签、版本未知、算法不受支持、`i=` 身份不在 `d=` 域名之内、`From` 不在签名的头字段之列),或者公钥记录无法使用。RFC 8601 把这种情况称为永久错误。对 DMARC 来说,这不算通过。
原因
格式错误或被截断的 DKIM-Signature
常见漏掉标签的自制签名代码、错误折叠或截断长头字段的邮件中继,或者被邮件客户端重新编码而损坏的签名头。
验证方不支持的算法
偶见`a=rsa-sha1`(已被 RFC 8301 弃用),或者较旧的接收方遇到的 `ed25519-sha256`。同时使用 RSA-SHA256 和 Ed25519 签名,可以兼顾所有接收方。
i= 不在签名域名之内
偶见代理标识符 `i=` 必须位于 `d=` 或其子域名之内。`d=example.com; i=@example.org` 是无效的。
From 头不在签名范围内
偶见RFC 6376 要求 `h=` 中包含 `From`。如果签名方配置了自定义头字段列表并漏掉了它,生成的签名会被接收方拒绝。
修复方法
- 1.
列出签名的标签
展开折叠的头字段,检查必需的标签及其取值;DKIM 调试器会完成这一步,并指出有问题的标签。
bash # Show the DKIM-Signature as one line and list its tags awk '/^DKIM-Signature:/{p=1} p&&/^[^ \t]/&&!/^DKIM-Signature:/{p=0} p' message.eml | tr -d '\r\n\t' | tr ';' '\n' # required: v=1 a= b= bh= d= h= (containing "from") s= - 2.
使用标准的签名配置
RSA-SHA256(可选择再加上 Ed25519);对 `From` 签名,并做超额签名(oversign);使用仍在维护的签名实现,而不是自定义代码。
text # OpenDKIM signer: standard algorithm, From always signed SignatureAlgorithm rsa-sha256 OversignHeaders From Canonicalization relaxed/simple
相关错误
dkim=fail reason="signature verification failed"OpenDKIM (Authentication-Results header added by the opendkim milter); mailauth reports the same as "bad signature"dkim=fail reason="key not found in DNS"OpenDKIM (Authentication-Results); mailauth reports it as dkim=neutral (no key)dkim=fail (body hash did not verify)DKIM verifiers (Gmail, mailauth, Rspamd…)