You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RFC 6376中DKIM签名示例验证失败问题求助

排查RFC 6376附录A.2 DKIM签名不符的核心要点

你的问题大概率不是RFC 6376示例的缺陷——该示例经勘误后是准确的,且你能正常通过RFC 8463测试,说明核心签名逻辑(SHA256哈希、RSA签名、Base64编码)没问题,问题出在DKIM签名流程的细节上,以下是必查项:

1. 头字段规范化必须严格遵循简单规范规则

DKIM签名前要对目标头字段执行简单规范化(simple canonicalization),这是最容易踩坑的环节:

  • 头字段名称保留原大小写,但字段名与冒号之间不能有空格,冒号与字段值之间必须有且仅有一个空格;
  • 字段值中的折叠换行(包括换行前的空白)要全部替换为单个空格,同时去掉字段值首尾的空白字符;
  • 比如示例中的Date头,展开后必须是date:Fri, 11 Oct 2002 07:55:23 -0700,不能有多余空格或换行。

2. 待签名头字段的顺序和内容必须完全匹配

必须严格按照s=标签指定的顺序(from:subject:date:message-id)拼接头字段,每个字段格式为字段名:字段值,字段之间用**单个换行符\n**分隔,不能多字段、少字段或调换顺序。

正确的待签名头拼接内容(勘误修正后)应为:

from:Joe SixPack <joe@football.example.com>
subject:October meeting
date:Fri, 11 Oct 2002 07:55:23 -0700
message-id:<20021011145523.28078.football@football.example.com>

将这段内容以UTF-8编码为字节数组后,再进行哈希和签名操作。

3. RSA签名的填充模式必须是RSASSA-PKCS1-v1_5

RFC 6376明确要求使用PKCS#1 v1.5填充,而非PSS填充。在C#中,需确保签名时指定RSASignaturePadding.Pkcs1,示例代码片段:

var rsa = RSA.Create();
rsa.ImportPkcs1PrivateKey(Convert.FromBase64String(privateKeyWithoutPemHeaders), out _);
var signature = rsa.SignData(signableHeadersBytes, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
var dkimSignature = Convert.ToBase64String(signature);

4. 私钥导入需匹配PKCS#1格式

RFC 6376附录C的私钥是PKCS#1格式的PEM文件(开头为-----BEGIN RSA PRIVATE KEY-----),导入时:

  • .NET Core 3.0+ 可直接用ImportPkcs1PrivateKey导入解码后的Base64字节;
  • 若用ImportFromPem(.NET 5+),需确保私钥格式正确,不要误将PKCS#1当成PKCS#8处理。

5. 签名后的Base64编码必须是标准格式

签名结果的Base64编码需使用标准Base64,不能用URL-safe变体,也不能添加换行或空格,Convert.ToBase64String默认符合要求,无需额外处理。

内容的提问来源于stack exchange,提问作者user_8675309

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 06:55:15