使用 DKIM 验证从自定义域发送的出站电子邮件
提示
你知道可以免费试用Office 365计划 2 Microsoft 365 Defender 中的功能吗? 在 Microsoft 365 Defender 门户试用中心使用 90 天Defender for Office 365试用版。 在此处了解谁可以注册和试用条款。
本文列出了在 Microsoft365 中使用域密钥识别邮件 (DKIM) 的步骤,以确保目标电子邮件系统信任从自定义域发送的出站邮件。
本文内容:
- DKIM 如何能够比单独使用 SPF 更有效地防止恶意欺骗
- 从 Microsoft 365 Defender 门户创建、启用和禁用 DKIM 的步骤
- 手动将 1024 位密钥升级到 2048 位 DKIM 加密密钥的步骤
- 手动设置 DKIM 的步骤
- 为多个自定义域配置 DKIM 的步骤
- 为自定义域禁用 DKIM 签名策略
- DKIM 和 Microsoft 365 的默认行为
- 设置 DKIM 以便第三方服务可以代表自定义域发送或假冒电子邮件
- 后续步骤:为 Microsoft 365 设置 DKIM 后
注意
Microsoft 365 自动为它的初始“onmicrosoft.com”域设置 DKIM。 这意味着无需执行任何操作,即可为任意初始域名(例如 litware.onmicrosoft.com)。 有关域的详细信息,请参阅关于域的常见问题。
DKIM 是三种身份验证方法(SPF、DKIM 和 DMARC)之一,可帮助防止攻击者发送看起来像来自你的域的邮件。
可以使用 DKIM 将数字签名添加到出站电子邮件的邮件头中。 配置 DKIM 时,将使用加密身份验证授权域关联到电子邮件或对电子邮件进行签名。 从域获取电子邮件的电子邮件系统可以使用此数字签名来帮助验证传入电子邮件是否合法。
基本来说,私钥对域的传出电子邮件的邮件头进行加密。 公钥在域的 DNS 记录中发布,接收服务器可以使用该密钥解码签名。 DKIM 验证帮助接收服务器确认邮件确实来自你的域,而非欺骗分子。
提示
你也可以选择对自己的自定义域不执行任何有关 DKIM 的操作。 如果你没有为自定义域设置 DKIM,Microsoft 365 会创建私钥和公钥对,启用 DKIM 签名,然后为自定义域配置 Microsoft 365 默认策略。
Microsoft-365 的内置 DKIM 配置足以覆盖大多数客户。 但是,应在以下情况下为自定义域手动配置 DKIM:
- 在 Microsoft 365 中有多个自定义域
- 您同时要设置 DMARC(推荐)
- 您想要控制您的私钥
- 您要自定义 CNAME 记录
- 你想为源自第三方域的电子邮件设置 DKIM 密钥,例如,如果你使用第三方群发邮件程序。
DKIM 如何能够比单独使用 SPF 更有效地防止恶意欺骗
SPF 将信息添加到邮件信封中,但 DKIM 是在邮件头中加密签名。 当你转发邮件时,转发服务器可能会截除邮件信封部分。 由于数字签名作为电子邮件头的一部分与电子邮件同时存在,因此即使当邮件进行了转发,DKIM 也仍在运行,如以下示例所示。
在此示例中,如果您只发布了域的一条 SPF TXT 记录,收件人的邮件服务器可能已将您的电子邮件标记为垃圾邮件,并生成一个误报结果。 在此方案中添加 DKIM 可减少 误报 垃圾邮件报告。 由于 DKIM 依赖于公钥加密(而不仅仅对 IP 地址加密)进行身份验证,DKIM 被认为是比 SPF 更强大的身份验证形式。 建议在部署中同时使用 SPF、DKIM 以及 DMARC。
提示
DKIM 使用私钥将加密的签名插入邮件头。 在邮件头中,将签名域或出站域作为 d = 字段中的值插入。 然后,验证域或收件人的域使用 d= 字段从 DNS 中查找公钥,对邮件进行身份验证。 如果邮件已经过验证,则 DKIM 检查通过。
从 Microsoft 365 Defender 门户创建、启用和禁用 DKIM 的步骤
租户的所有接受域都将显示在 Microsoft 365 Defender 门户中的 DKIM 页下。 如果未看到,请从 域页面 添加接受的域。 添加域后,按照如下所示的步骤配置 DKIM。
步骤 1:在 DKIM 页上,选择要配置的域。
步骤 2:将开关滑动到“启用”。 你将看到一个弹出窗口,指出需要添加 CNAME 记录。
步骤 3:复制弹出窗口中显示的 CNAMES
步骤 4:将复制的 CNAME 记录发布到 DNS 服务提供程序。
在 DNS 提供程序的网站上,为要启用的 DKIM 添加 CNAME 记录。 请确保将每个字段设置为以下值:
Record Type: CNAME (Alias)
> Host: Paste the values you copy from DKIM page.
Points to address: Copy the value from DKIM page.
TTL: 3600 (or your provider default)
步骤 5:返回到 DKIM 页以启用 DKIM。
如果看到 CNAME 记录不存在错误,则可能是由于:
- 与 DNS 服务器同步,这可能需要几秒钟到几个小时。如果问题仍然存在,请重复这些步骤
- 检查是否有任何复制粘贴错误,如额外的空格或选项卡等。
如果要禁用 DKIM,请切换回禁用模式
手动将 1024 位密钥升级到 2048 位 DKIM 加密密钥的步骤
注意
Microsoft 365 会自动为 onmicrosoft.com 域设置 DKIM。 无需任何步骤就可以将 DKIM 用于任何初始域名(如 litware.onmicrosoft.com)。 有关域的详细信息,请参阅关于域的常见问题。
由于 DKIM 键同时支持 1024 位和 2048 位版,这些说明将告诉你如何在 Exchange Online PowerShell中将 1024 位密钥升级到 2048。 以下步骤针对的是两种用例,请选择最适合你的配置的步骤。
如果 配置了 DKIM,请通过运行以下命令轮换位数:
Rotate-DkimSigningConfig -KeySize 2048 -Identity <DkimSigningConfigIdParameter>
或者
要 实现新的 DKIM,请运行以下命令:
New-DkimSigningConfig -DomainName <Domain for which config is to be created> -KeySize 2048 -Enabled $true
保持连接到 Exchange Online PowerShell 运行 验证是否包括该配置:
Get-DkimSigningConfig -Identity <Domain for which the configuration was set> | Format-List
提示
这一新的 2048 位密钥将在 RotateOnDate 生效,在过渡期间则使用 1024 位密钥发送电子邮件。 四天后,可以使用 2048 位秘钥再次进行测试(即一旦轮换对第二个选择器生效)。
如果要旋转到第二个选择器,请在四天后确认 是否正在使用 2048 位,然后通过使用上面列出的适当 cmdlet 手动轮换第二个选择器键。
有关详细语法和参数信息,请参阅以下文章: Rotate-DkimSigningConfig、 New-DkimSigningConfig和 Get-DkimSigningConfig。
手动设置 DKIM 的步骤
要配置 DKIM,您需要完成以下步骤:
在 DNS 中发布自定义域的两条 CNAME 记录
对于您要为其在 DNS 中添加 DKIM 签名的每个域,您需要发布两条 CNAME 记录。
注意
如果尚未阅读完整文章,则你可能遗漏了此节约时间的 PowerShell 连接信息: 连接到 Exchange Online PowerShell。
在 Exchange Online PowerShell 中运行以下命令以创建选择器记录:
New-DkimSigningConfig -DomainName <domain> -Enabled $false
Get-DkimSigningConfig -Identity <domain> | Format-List Selector1CNAME, Selector2CNAME
如果在 Microsoft 365 中除了初始域外你还预配了自定义域,必须为每个附加域发布两条 CNAME 记录。 因此,如果你有两个域,就必须发布两条额外的 CNAME 记录,依此类推。
CNAME 记录使用以下格式。
重要
如果你是我们的 GCC High 客户,我们会以不同方式计算 customDomainIdentifier! 不是查找你的 initialDomain 来计算 customDomainIdentifier,而是直接从自定义域计算。 例如,如果自定义域名为“contoso.com”,则 customDomainIdentifier将变为“contoso-com”,任何句点都将替换为短划线。 因此,无论 initialDomain 指向什么 MX 记录,你都将始终使用上述方法来计算要在 CNAME 记录中使用的 customDomainIdentifier。
Host name: selector1._domainkey
Points to address or value: selector1-<customDomainIdentifier>._domainkey.<initialDomain>
TTL: 3600
Host name: selector2._domainkey
Points to address or value: selector2-<customDomainIdentifier>._domainkey.<initialDomain>
TTL: 3600
其中:
对于 Microsoft 365,选择器始终为“selector1”或“selector2”。
customDomainIdentifier 与显示在 mail.protection.outlook.com 前面的自定义域的自定义 MX 记录中的 customDomainIdentifier 相同。 例如,在域 contoso.com 的以下 MX 记录中,customDomainIdentifier 为 contoso com:
contoso.com。 3600 在 MX 5 contoso-com.mail.protection.outlook.com
initialDomain 是你在注册 Microsoft 365 时所使用的域。 初始域始终以 onmicrosoft.com 结尾。 有关确定初始域的信息,请参阅关于域的常见问题。
例如,如果你有一个初始域 cohovineyardandwinery.onmicrosoft.com,以及两个自定义域 cohovineyard.com 和 cohowinery.com,那么你需要为额外配置的每个域设置两条 CNAME 记录,总共四条 CNAME 记录。
Host name: selector1._domainkey
Points to address or value: selector1-cohovineyard-com._domainkey.cohovineyardandwinery.onmicrosoft.com
TTL: 3600
Host name: selector2._domainkey
Points to address or value: selector2-cohovineyard-com._domainkey.cohovineyardandwinery.onmicrosoft.com
TTL: 3600
Host name: selector1._domainkey
Points to address or value: selector1-cohowinery-com._domainkey.cohovineyardandwinery.onmicrosoft.com
TTL: 3600
Host name: selector2._domainkey
Points to address or value: selector2-cohowinery-com._domainkey.cohovineyardandwinery.onmicrosoft.com
TTL: 3600
注意
创建第二条记录非常重要,但创建时仅可使用其中一个选择器。 实际上,第二个选择器可能指向尚未创建的地址。 我们仍然建议创建第二条 CNAME 记录,因为你的密钥轮换是无缝的。
为自定义域启用 DKIM 签名的步骤
在 DNS 中发布 CNAME 记录后,就可以通过 Microsoft 365 启用 DKIM 签名了。 为此,可以使用 Microsoft 365 管理中心或 PowerShell。
若要在 Microsoft 365 Defender 门户中为自定义域启用 DKIM 签名
在 Microsoft 365 Defender 门户中https://security.microsoft.com,转到“规则&”部分>DKIM 中的Email协作>策略&>规则威胁策略>Email身份验证设置。 若要直接转到 DKIM 页面,请使用 https://security.microsoft.com/dkimv2。
在 DKIM 页面,通过点击名称选择域。
在显示的详细信息浮出控件中,将“ 使用 DKIM 签名为此域签名消息 ”设置更改为 “启用 (
)
完成后,请点击 轮换 DKIM 密钥。
对每个自定义域重复这些步骤。
如果是首次配置 DKIM,并且看到错误“没有为此域保存 DKIM 密钥”,则必须使用 Windows PowerShell 启用 DKIM 签名,如下一步中所述。
使用 PowerShell 为自定义域启用 DKIM 签名
重要
如果是首次配置 DKIM,并且看到错误“没有为此域保存 DKIM 密钥”,请完成下面的步骤 2 中的命令 (例如,
Set-DkimSigningConfig -Identity contoso.com -Enabled $true
) 查看密钥。
使用以下语法:
Set-DkimSigningConfig -Identity <Domain> -Enabled $true
<域> 是要为其启用 DKIM 签名的自定义域的名称。
此示例为域名 contoso.com 启用了 DKIM 签名:
Set-DkimSigningConfig -Identity contoso.com -Enabled $true
确认是否已为 Microsoft 365 正确配置 DKIM 签名的具体步骤
请等待几分钟,然后按以下步骤操作,确认是否已正确配置 DKIM。 这样就有时间将域的 DKIM 信息分布到整个网络了。
从 Microsoft 365 中已启用 DKIM 的域内的帐户向其他电子邮件帐户(如 outlook.com 或 Hotmail.com)发送邮件。
不要将 aol.com 帐户用于测试目的。 如果 SPF 检查通过,AOL 可能会跳过 DKIM 检查。 这会使测试无效。
打开邮件,然后查看邮件头。 查看邮件头的说明因邮件客户端而异。 有关在 Outlook 中查看邮件头的说明,请参阅 在 Outlook 中查看 Internet 邮件头。
进行了 DKIM 签名的邮件将包含主机名以及您在发布 CNAME 条目时定义的域。 该邮件如下例所示:
From: Example User <example@contoso.com> DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; s=selector1; d=contoso.com; t=1429912795; h=From:To:Message-ID:Subject:MIME-Version:Content-Type; bh=<body hash>; b=<signed field>;
查找身份验证结果标头。 尽管每个接收服务用于标记传入邮件的格式稍有不同,但结果应都包括以下类似内容: DKIM=pass 或 DKIM=OK
重要
在以下任一情况下,省 略 DKIM 签名:
- 发件人和收件人电子邮件地址位于同一域中。
- 发件人和收件人电子邮件地址位于同一组织控制的不同域中。
在这两种情况下,标头将如下所示:
Authentication-Results: dkim=none (message not signed) header.d=none;
dmarc=none action=none header.from=<sender_domain>;
为多个自定义域配置 DKIM 的具体步骤
如果你在将来决定添加其他自定义域,并且想要为新域启用 DKIM,必须为每个域完成本文中介绍的步骤。 具体而言,完成手动设置 DKIM 需要执行的操作中的所有步骤。
为自定义域禁用 DKIM 签名策略
禁用签名策略不会完全禁用 DKIM。 一段时间后,如果默认策略仍处于启用状态,则 Microsoft 365 将自动为域应用默认策略。 如果希望完全禁用 DKIM,则需要同时在自定义域和默认域上禁用 DKIM。 有关详细信息,请参阅 DKIM 和 Microsoft 365 的默认行为。
使用 Windows PowerShell 禁用 DKIM 签名策略
为您要为其禁用 DKIM 签名的每个域运行以下命令之一。
$p = Get-DkimSigningConfig -Identity <Domain> $p[0] | Set-DkimSigningConfig -Enabled $false
例如:
$p = Get-DkimSigningConfig -Identity contoso.com $p[0] | Set-DkimSigningConfig -Enabled $false
或
Set-DkimSigningConfig -Identity $p[<number>].Identity -Enabled $false
其中, number 是策略的索引。 例如:
Set-DkimSigningConfig -Identity $p[0].Identity -Enabled $false
DKIM 和 Microsoft 365 的默认行为
如果不启用 DKIM,Microsoft 365 会自动为 Microsoft Online 电子邮件路由地址 (MOERA)/初始域创建 2048 位 DKIM 公钥,以及我们存储在内部(我们的数据中心中)的关联私钥。 默认情况下,Microsoft 365 对没有适当策略的域使用默认签名配置。 也就是说,如果你自己没有设置 DKIM,Microsoft 365 会使用它的默认策略和它创建的密钥来为你的域启用 DKIM。
此外,如果启用后在自定义域上禁用 DKIM 签名,则在一段时间后,Microsoft 365 将自动为自定义域应用 MOERA/初始域策略。
在以下示例中,假设 fabrikam.com 的 DKIM 是由 Microsoft 365(而不是域管理员)启用。 这表明所需的 CNAME 在 DNS 中不存在。 来自此域的电子邮件的 DKIM 签名如下所示:
From: Second Example <second.example@fabrikam.com>
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed;
s=selector1-fabrikam-com; d=contoso.onmicrosoft.com; t=1429912795;
h=From:To:Message-ID:Subject:MIME-Version:Content-Type;
bh=<body hash>;
b=<signed field>;
在此示例中,主机名和域包含在 fabrikam.com 的 DKIM 签名由域管理员启用情况下 CNAME 将指向的值。 最终,每封发送自 Microsoft 365 的邮件都会进行 DKIM 签名。 如果您自行启用 DKIM,该域将与发件人地址(此例中为 fabrikam.com)中的域相同。 如果不自行启用,该域将不同于发件人地址中的域,而是会使用组织的初始域。 有关确定初始域的信息,请参阅关于域的常见问题。
设置 DKIM 以便第三方服务可以代表自定义域发送或假冒电子邮件
一些批量电子邮件服务提供商或服务型软件提供商允许你为来自其服务的电子邮件设置 DKIM 密钥。 这需要你自己和第三方之间进行协调,从而设置必要的 DNS 记录。 一些第三方服务器可以有自己的、具有不同选择器的 CNAME 记录。 没有任何两个组织的操作过程是完全相同的。 而是,该过程完全取决于组织。
显示为 contoso.com 和 bulkemailprovider.com 正确配置了 DKIM 的示例邮件如下所示:
Return-Path: <communication@bulkemailprovider.com>
From: <sender@contoso.com>
DKIM-Signature: s=s1024; d=contoso.com
Subject: Here is a message from Bulk Email Provider's infrastructure, but with a DKIM signature authorized by contoso.com
在此示例中,为了获得该结果:
批量电子邮件提供商为 Contoso 提供一个 DKIM 公钥。
Contoso 将 DKIM 密钥发布到 DNS 记录。
发送电子邮件时,批量电子邮件提供商使用相应的私钥对密钥进行签名。 这样一来,批量电子邮件提供商可以将 DKIM 签名附加到邮件头中。
接收电子邮件系统通过对 From 中的域进行 DKIM-Signature d=<domain> 值验证来执行 DKIM 检查:(5322.From) 邮件的地址。 在此示例中,值匹配:
sender@contoso.com
d=contoso.com
确定不发送电子邮件的域
组织应该通过在这些域的DKIM记录中明确说明 v=DKIM1; p=
域是否不发送电子邮件。 这将告知接收邮件的服务器,该域没有有效的公共密钥,任何声称来自该域的邮件都应该被拒绝。 应该为每个域和子域使用通配符DKIM来执行此操作。
例如,DKIM 记录将如下所示:
*._domainkey.SubDomainThatShouldntSendMail.contoso.com. TXT "v=DKIM1; p="
后续步骤:为 Microsoft 365 设置 DKIM 后
尽管 DKIM 旨在帮助防止欺骗,但 DKIM 与 SPF 和 DMARC 协同工作效果更佳。
设置了 DKIM 后,如果你尚未设置 SPF,则应执行此操作。 有关 SPF 的快速介绍和快速配置,请参阅 在 Microsoft 365 中设置 SPF 以帮助防止欺骗。 若要更深入地了解 Microsoft 365 如何使用 SPF,或要了解故障排除或非标准部署(如混合部署),请从 Microsoft 365 如何使用发件人策略框架 (SPF) 以防欺骗入手。
接下来,请参阅使用 DMARC 验证电子邮件。 反垃圾邮件邮件头包括 Microsoft 365 用来执行 DKIM 检查的语法和头字段。
此测试将验证 DKIM 签名配置是否正确配置,以及是否发布了正确的 DNS 条目。
注意
此功能需要 Microsoft 365 管理员帐户。 此功能不适用于由世纪互联运营的 Microsoft 365 政府版、Microsoft 365 或 Microsoft 365 德国版。
更多信息
通过 PowerShell 进行密钥轮换:Rotate DkimSigningConfig