通过 SMTP 中继解决 Gsuite 中的 DKIM 故障

通过 SMTP 中继解决 Gsuite 中的 DKIM 故障
通过 SMTP 中继解决 Gsuite 中的 DKIM 故障

排查 Google Workspace 的 DKIM 问题

在 Gsuite 电子邮件解决方案中遇到 DKIM 故障可能会令人沮丧,尤其是在使用安全电子邮件网关扫描出站电子邮件时。在 Gsuite 中设置自定义 DKIM 密钥时经常会出现此问题,导致“dkim=neutral(主体哈希未验证)”结果,收件人将其视为失败。

了解 DKIM 在 Gmail 将电子邮件发送到安全电子邮件网关 (SEG),然后通过 Gmail SMTP 中继进行中继的配置中如何工作至关重要。本文旨在帮助您有效地诊断和解决这些 DKIM 故障。

命令 描述
dkim.verify 使用提供的 DKIM 密钥验证电子邮件的 DKIM 签名。
dns.resolver.resolve 查询 DNS 以获取与 DKIM 密钥选择器和域关联的 TXT 记录。
message_from_bytes 将电子邮件从类似字节的对象解析为电子邮件对象。
opendkim-genkey 使用指定的选择器和域生成新的 DKIM 密钥对。
Canonicalization 设置标头和正文的 DKIM 规范化方法(宽松/简单)。
SyslogSuccess 将成功的 DKIM 操作记录到系统日志中以进行监控和调试。

了解 DKIM 脚本及其功能

提供的 Python 脚本通过提取电子邮件的 DKIM 标头并在 DNS 中查询与域和选择器关联的 DKIM 密钥来帮助验证 DKIM 签名。该脚本使用 dkim.verify 确保 DKIM 签名有效的功能,这对于维护电子邮件的完整性和真实性至关重要。这 dns.resolver.resolve 命令在 DNS 中查询链接到 DKIM 密钥的 TXT 记录,同时 message_from_bytes 将电子邮件从类似字节的对象转换为可读的消息格式。

Postfix 配置脚本用于在安全电子邮件网关 (SEG) 上设置 DKIM 签名。通过使用适当的设置安装和配置 OpenDKIM,例如 Canonicalization 对于 DKIM 签名和 SyslogSuccess 对于日志记录操作,该脚本确保出站电子邮件已使用 DKIM 密钥正确签名。 bash 脚本自动执行检查和更新 DKIM DNS 记录的过程,从而更轻松地管理 DKIM 密钥并确保为您的域正确配置它们。

使用自定义脚本解决 Gsuite 中的 DKIM 故障

检查 DKIM 签名的 Python 脚本

import dkim
import dns.resolver
from email import message_from_bytes
def check_dkim(email_bytes):
    msg = message_from_bytes(email_bytes)
    dkim_header = msg['DKIM-Signature']
    domain = dkim_header.split('@')[1].split(' ')[0]
    selector = dkim_header.split('=')[1].split(';')[0]
    dns_response = dns.resolver.resolve(f'{selector}._domainkey.{domain}', 'TXT')
    dkim_key = dns_response[0].to_text().strip(' "')
    dkim.verify(email_bytes, dkim_key)
email_path = 'path/to/email.eml'
with open(email_path, 'rb') as f:
    email_bytes = f.read()
check_dkim(email_bytes)

确保通过 Postfix 正确处理 DKIM

DKIM 签名的 Postfix 配置

sudo apt-get install opendkim opendkim-tools
sudo nano /etc/opendkim.conf
AutoRestart             Yes
AutoRestartRate         10/1h
Syslog                 yes
SyslogSuccess          Yes
LogWhy                 Yes
Canonicalization       relaxed/simple
Mode                   sv
SubDomains             no

自动 DKIM DNS 检查和更新

用于 DNS 验证和 DKIM 更新的 Bash 脚本

#!/bin/bash
DOMAIN="yourdomain.com"
SELECTOR="default"
DKIM_RECORD=$(dig TXT ${SELECTOR}._domainkey.${DOMAIN} +short)
if [[ -z "$DKIM_RECORD" ]]; then
  echo "DKIM record not found for $DOMAIN with selector $SELECTOR"
else
  echo "DKIM record for $DOMAIN: $DKIM_RECORD"
fi
sudo opendkim-genkey -s ${SELECTOR} -d ${DOMAIN}
sudo mv ${SELECTOR}.private /etc/opendkim/keys/${DOMAIN}/
sudo chown opendkim:opendkim /etc/opendkim/keys/${DOMAIN}/${SELECTOR}.private

解决电子邮件网关的 DKIM 问题

将 Google Workspace 与安全电子邮件网关结合使用时,一个常见问题是网关更改了电子邮件的正文内容,导致 DKIM 签名验证失败。为了缓解这种情况,请确保网关配置为保留电子邮件正文的完整性。另一种方法是将网关配置为在电子邮件到达 Gmail SMTP 中继之前使用组织的 DKIM 密钥对电子邮件进行重新签名。

此外,了解操作顺序以及 DKIM 签名发生的位置也至关重要。如果 SEG 在 Google 签名后修改电子邮件,则可能会导致不匹配。配置 SEG 以适当处理 DKIM 密钥可以防止失败。确保 Google Workspace、SEG 和 SMTP 中继之间正确同步对于维护电子邮件完整性至关重要。

有关 DKIM 问题的常见问题与解答

  1. 为什么我的 DKIM 签名通过 SEG 后失败?
  2. SEG 可能会更改电子邮件内容,导致正文哈希不匹配。确保 SEG 不会修改电子邮件或使用正确的 DKIM 密钥重新签名。
  3. 我可以在此设置中使用多个 DKIM 密钥吗?
  4. 是的,但必须在每个阶段管理对电子邮件进行签名的键以防止冲突。
  5. 如何验证我的 DKIM 设置是否正确?
  6. 使用类似的工具 MXtoolbox 或者 dkim.verify 在脚本中检查 DKIM 签名的有效性。
  7. Gmail SMTP 中继在 DKIM 签名中起什么作用?
  8. 它将电子邮件转发给收件人,如果配置的话,可能会添加另一个 DKIM 签名。
  9. 如何确保我的 SEG 不会更改电子邮件内容?
  10. 检查并调整 SEG 的策略和设置,以保持电子邮件正文的完整性。
  11. 目的是什么 Canonicalization 环境?
  12. 它指定在签名之前如何规范电子邮件的标头和正文,这可能会影响 DKIM 验证。
  13. 为什么默认的 Google DKIM 密钥可以工作,但我的自定义密钥却不起作用?
  14. 自定义密钥可能未在 DNS 中正确配置或传播。使用 DNS 工具进行验证。
  15. Google Workspace 和 SEG 是否都需要拥有 DKIM 密钥?
  16. 不一定,但在两者之间拥有一致的 DKIM 密钥可以简化故障排除并增强安全性。

关于 DKIM 配置挑战的最终想法

要解决使用 SMTP 中继和 SEG 时 Google Workspace 中的 DKIM 故障,需要了解每个组件的交互方式。必须确保 SEG 不会以导致 DKIM 签名无效的方式更改电子邮件内容。配置 SEG 和 Google Workspace 以正确处理 DKIM 密钥对于维护出站消息的完整性和真实性至关重要。

通过遵循提供的脚本和配置,您可以有效地排查和解决 DKIM 问题。使用 DNS 工具和电子邮件验证器定期验证您的 DKIM 设置将有助于维护安全可靠的电子邮件系统。确保所有组件之间正确同步将防止 DKIM 故障并增强电子邮件安全性。