DKIM 签署来自任何域的外发邮件(使用 Postfix 和 Ubuntu)

Bri*_*ong 40 postfix dkim

我在我的邮件服务器(postfix 和 ubuntu)上安装了 DKIM,所以它对传出的电子邮件进行了签名。我使用了这些说明:https : //help.ubuntu.com/community/Postfix/DKIM

但是,我需要它来签署来自任何域(在发件人地址中)的电子邮件,而不仅仅是我自己的。我正在构建一个电子邮件通讯服务,客户将通过服务器发送他们自己的电子邮件。

首先我在 /etc/dkim-filter.conf 中设置“域 *”。这使它在所有外发电子邮件中包含 DKIM 标头,无论域是什么。

但是,gmail 上的验证检查失败,因为它正在检查发件人地址中的域,而不是我的域(和 dns 记录)。有谁知道如何做到这一点?

Bri*_*ong 43

好的,我设法自己解决了这个问题,但我想在这里发布这些步骤以供后代使用,因为这方面的文档为零(我可以找到),而且实际上是猜测和检查。

如上所述设置“域*”后,它会像这样签名:

DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=clientdomain.com;
    s=main; t=1250005729;
    bh=twleuNpYDuUTZQ/ur9Y2wxCprI0RpF4+LlFYMG81xwE=;
    h=Date:From:To:Message-Id:Subject:Mime-Version:Content-Type;
    b=kohI7XnLlw/uG4XMJoloc4m9zC13g48+Av5w5z7CVE0u3NxsfEqwfDriapn7s7Upi
     31F3k8PDT+eF57gOu2riXaOi53bH3Fn/+j0xCgJf8QpRVfk397w4nUWP/y8tz4jfRx
     GhH21iYo05umP0XflHNglpyEX02bssscu2VzXwMc=
Run Code Online (Sandbox Code Playgroud)

注意“d=clientdomain.com”。它是根据电子邮件中的发件人地址生成的,其中发件人地址类似于“contact@clientdomain.com”。显然,如果它检查了客户端的域而不是我的域,则没有 DNS TXT 记录存在并且验证将失败。

所以无论如何我在这个文档中发现你可以设置一个 KeyList 参数。 http://manpages.ubuntu.com/manpages/hardy/man5/dkim-filter.conf.5.html

它并没有真正描述我想做什么,但我想我会玩它。我注释掉 KeyFile 并将 KeyList 设置为“/etc/mail/dkim_domains.key”,这是我编造的任意文件名。然后我创建了该文件并将其放入“*:feedmailpro.com:/etc/mail/dkim.key”中。这告诉它任何客户端域,使用我的域 (feedmailpro.com) 对其进行签名,并使用 dkim.key 文件。

重新启动 DKIM 和 postfix

sudo /etc/init.d/dkim-filter restart
sudo /etc/init.d/postfix restart
Run Code Online (Sandbox Code Playgroud)

现在这是我发送测试电子邮件时生成的密钥。

DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=feedmailpro.com;
    s=dkim.key; t=1250005729;
    bh=twleuNpYDuUTZQ/ur9Y2wxCprI0RpF4+LlFYMG81xwE=;
    h=Date:From:To:Message-Id:Subject:Mime-Version:Content-Type;
    b=kohI7XnLlw/uG4XMJoloc4m9zC13g48+Av5w5z7CVE0u3NxsfEqwfDriapn7s7Upi
     31F3k8PDT+eF57gOu2riXaOi53bH3Fn/+j0xCgJf8QpRVfk397w4nUWP/y8tz4jfRx
     GhH21iYo05umP0XflHNglpyEX02bssscu2VzXwMc=
Run Code Online (Sandbox Code Playgroud)

改进后,您会看到 d= now 设置为我的域(即使电子邮件的发件人地址不是我的域)。但是 s= 已更改为“dkim.key”,而不是我在 dkim-filter.conf 中选择的选择器。在原始设置说明中,我将选择器设置为“邮件”。这很奇怪,但我注意到它已将其更改为我的密钥的文件名 dkim.key。

所以我去把“/etc/mail/dkim.key”重命名为“/etc/mail/mail”。还更新了“/etc/mail/dkim_domains.key”中对它的引用。

重新启动 dkim-filter 和 postfix 与上面相同,现在它开始工作了。这是使用正确选择器正确签名的最终标头(显然基于密钥的文件名)。

DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=feedmailpro.com;
    s=mail; t=1250006218;
    bh=tBguOuDhBDlhv0m4KF66LG10V/8ijLcAKZ4JbjpLXFM=;
    h=Date:From:To:Message-Id:Subject:Mime-Version:Content-Type;
    b=c9eqvd+CY86BJDUItWVVRvI3nibfEDORZbye+sD1PVltrcSBOiLZAxF3Y/4mP6vRX
     MUUNCC004oIH1u7FYafgF32lpuioMP1cd7bi6x3AZ5zH4BYETNBnnz4AhAPBtqlIh/
     FFMz8jkhhLhcM2hDpwJkuKjAe3LzfNVDP8kD11ZI=
Run Code Online (Sandbox Code Playgroud)

现在 s=mail 是正确的,d=feedmailpro.com 是正确的。有用!

总的来说,这比我预期的要困难得多,而且似乎没有关于如何执行此操作的文档(为所有传出域签名),但我想它是开源软件,所以我不能抱怨。

最后要注意的是,要检查 TXT DNS 记录是否设置正确,您可以使用您的域执行类似的命令

dig mail._domainkey.feedmailpro.com TXT
Run Code Online (Sandbox Code Playgroud)

可能需要安装dig(sudo apt-get install dig)。如果您使用 Slicehost 管理器添加 DNS 条目,您将像这样输入 TXT 记录。

Type: TXT
Name: mail._domainkey
Data: k=rsa; t=s; p=M5GfMA0...YOUR LONG KEY...fIDAQAB
TTL seconds: 86400
Run Code Online (Sandbox Code Playgroud)

我真的不明白为什么将名称设置为“mail._domainkey”而没有句号结尾或没有我的域,例如“mail._domainkey.feedmailpro.com”。但无论如何,它似乎有效,所以我很高兴。

如果你想复制这个,这里是我开始的说明:https : //help.ubuntu.com/community/Postfix/DKIM

  • 感谢您把它放在这里,它正在帮助其他人(比如我):) (2认同)

小智 16

受 Brian Armstrong 对 dkim-filter 的回答的启发,这是我为OpenDKIM 所做的

/etc/opendkim.conf

Syslog          yes
UMask           002
KeyTable        /etc/mail/dkim_key_table
SigningTable    refile:/etc/mail/dkim_signing_table
Run Code Online (Sandbox Code Playgroud)

请注意,SigningTable 有 refile 在它的定义中,这指定文件包含正则表达式;在我们的例子中是 * 通配符。

/etc/mail/dkim_key_table

keyname  example.com:selector:/etc/mail/selector.key
Run Code Online (Sandbox Code Playgroud)

这里的keyname用于匹配这个文件和 dkim_signing_table 文件之间的密钥。在我的真实文件中,我将其命名为与我的选择器相同的名称。

example.comselector应该分别替换为您希望在签名的d=s= 中使用的域和选择器。

/etc/mail/dkim_signing_table

*   keyname
Run Code Online (Sandbox Code Playgroud)

该文件简单地将From:标头中的地址映射到 dkim_key_table 中的一个键。在这种情况下,我们希望通过此服务器发送的所有电子邮件都使用相同的密钥进行签名,因此使用 * 通配符。