为Ubuntu,Postfix和Mailman设置DKIM(DomainKeys)

我正在使用Postfix和Mailman运行Ubuntu 12.04。 我想建立DKIM 。 DomainKeys Identified Mail,或DKIM,是雅虎“DomainKeys”的inheritance者。 它包含思科的识别邮件。

设置它的步骤是什么?

推荐使用opendkim吗?

我唯一的参考是HowToForge ,但我更喜欢在这里获得帮助(即使它只是确认了该链接的步骤)。 实际上,我认为HowToForge的信息已经过时,因为它提到了dkim-filter而不是opendkim。

Ubuntu Server 12.04LTS上的openDKIM和Postfix

我会尝试回来并更好地格式化。 但由于有人要求发布我的答案,我现在想发布它而不是等到我有时间正确格式化它。 由于时间不够,我将整个答案整理成一个块区。 我希望这个解决方案很有帮助。

这些是我的参考:

维基百科在这个问题上有很好的参与

至少你需要:

  • Root访问您的邮件服务器
  • 访问以更新域的DNS记录

从存储库安装opendkim:

 # sudo apt-get install opendkim opendkim-tools 

您必须决定要使用的“选择器”。 选择器本质上是一个词来描述您想要使用的键。 在这里,我将使用选择器201205,因为密钥在2012年5月生效(狡猾?)。 我举两个变化的例子,希望能增加清晰度。 您只需要生成一个密钥。 但是,我给出了两个例子,你可以比较它们。

  • 201205(第一把钥匙)
  • my_selector(第二个键)

我的域名将是example.com ,但我将使用子域名作为我的第二个示例:

  • example.com(第一键)
  • mail.example.com(第二键)

我决定在以下目录中工作:

 # mkdir /etc/opendkim/ # cd /etc/opendkim 

使用您选择的选择器和域生成当前目录中的密钥。

 # opendkim-genkey -s 201205 -d example.com 

您可能需要也可能不需要更改所有权。 请参阅下面第二个键的示例中的详细信息,了解所有权和权限。

首先,您应该检查是否有opendkim用户(您的用户/组ID可能不同):

 # grep opendkim /etc/passwd opendkim:x:108:117::/var/run/opendkim:/bin/false 

你可能需要这样做:

 # chmod 700 /var/run/opendkim 

注意:Ubuntu 12.04不需要接下来的两个命令。 但是如果上面的命令没有显示用户opendkim设置正确,那么就这样做:

 # useradd -r -g opendkim -G mail -s /sbin/nologin -d /var/run/opendkim -c "OpenDKIM" opendkim # chown opendkim:opendkim 201205.private # cat 201205.private -----BEGIN RSA PRIVATE KEY----- ABCCXQ...[long string]...SdQaZw9 -----END RSA PRIVATE KEY----- 

现在检查公钥并注意有一个错误(在Ubuntu 12.04上的openDKIM 2.5.2中)! where is contains ;=rsa; ,它应该包含;k=rsa;k缺失了。 请插入它。

 # cat 201205.txt 201205._domainkey IN TXT "v=DKIM1;=rsa; p=WIGfM..[snip]..QIDIAB" ; ----- DKIM 201205 for example.com 

修复后,它将如下所示:

 201205._domainkey IN TXT "v=DKIM1;k=rsa; p=WIGfM..[snip]..QIDIAB" ; ----- DKIM 201205 for example.com 

此外,你可能需要像这样逃避分号。 如果您不想要结束评论,只需将其删除即可。 另请注意,您应该添加t = y标志以指示接收服务器您正在测试DKIM但尚未主动使用它。 你留下了可行的资源记录:

 201205._domainkey IN TXT "v=DKIM1\;k=rsa\;t=y\;p=WIGfM..[snip]..QIDIAB" 

您必须将上述公钥的内容发布到权威DNS服务器。 我建议使用TXT记录。 关于是否使用SPF记录或两种类型似乎存在一些争议。 经过一些阅读,我选择专门坚持TXT记录类型,虽然我不相信这是关于这个主题的最后一句话。

您应该使用一个短TTL(生存时间),以便您可以更改密钥,而无需等待它通过DNS传播的年龄。 我用了180秒。

生成密钥对的第二个例子对我来说有点棘手。 我会描述我的所作所为。 第一个元素是我使用域值“example.com”,即使密钥将用于“mail.example.com”。 我通过反复试验来到这里。 它工作,而使用“mail.example.com”不起作用。 不幸的是,我不知道背后的原因。 这实际上是我遇到的唯一区别,但令人不安的是我觉得我应该记录使用子域的经验。 我找到的其他初级教程都没有这样做。 生成第二个键:

 opendkim-genkey -s my_selector -d example.com 

检查私钥的所有权和权限,如上所述。 这是他们应该是这样的:

 # ls -la /etc/opendkim -rw------- 1 opendkim opendkim 891 May 10 07:44 my_selector.private 

发布DNS记录后,请使用dig检查。 它应该返回您在资源记录(RR)中输入的内容。

 $ dig 201205._domainkey.example.com txt +short "v=DKIM1\;k=rsa\;t=y\;p=WIGfM..[snip]..QIDIAB" 

现在,测试一下密钥。 下面的命令假设您位于密钥所在的目录中(/ etc / opendkim)。

 # opendkim-testkey -d example.com -s 201205 -k 201205.private -vvv opendkim-testkey: key loaded from /etc/opendkim/201205.private opendkim-testkey: checking key '201205._domainkey.example.com' opendkim-testkey: key not secure opendkim-testkey: key OK 

这些结果是预期的。 “密钥不安全”并不表示错误。 这是不使用DNSSSEC的预期结果。 根据我的阅读,DNSSEC即将到来,但尚未准备好迎接黄金时段。

第二个键的示例:

 # opendkim-testkey -d example.com -s my_selector -k /etc/opendkim/my_selector.private -vvvv opendkim-testkey: key loaded from /etc/opendkim/my_selector.private opendkim-testkey: checking key 'my_selector._domainkey.example.com' opendkim-testkey: key not secure opendkim-testkey: key OK 

请注意,opendkim报告密钥不安全。 这与DNSSEC没有在我的DNS服务器上实现这一事实有关,理论上有人可以拦截DNS查找并用自己的密钥替换它。

编辑OpenDKIM配置文件:

 # nano /etc/opendkim.conf # cat /etc/opendkim.conf # This is a basic configuration that can easily be adapted to suit a standard # installation. For more advanced options, see opendkim.conf(5) and/or # /usr/share/doc/opendkim/examples/opendkim.conf.sample. # Domain example.com KeyFile /etc/opendkim/201205.private Selector 201205 # # Commonly-used options Canonicalization relaxed/simple Mode sv SubDomains yes # Log to syslog Syslog yes LogWhy yes # Required to use local socket with MTAs that access the socket as a non- # privileged user (eg Postfix) UMask 022 UserID opendkim:opendkim # KeyTable /etc/opendkim/KeyTable SigningTable /etc/opendkim/SigningTable ExternalIgnoreList /etc/opendkim/TrustedHosts InternalHosts /etc/opendkim/TrustedHosts # Socket inet:8891@localhost #EOF 

如果您使用我的第二个关键示例,使用目标域“mail.example.com”,该条目仍将仅引用主域:

 Domain example.com KeyFile /etc/dkim/my_selector.private Selector my_selector ----- 

请注意我的一个来源:如果你运行Postfix的多个实例,你需要将它添加到每个实例的opendkim.conf(或者你想要使用opendkim的实例)

使用文本编辑器/etc/opendkim/TrustedHosts创建一个文件:

添加应由OpenDKIM处理的域,主机名和/或IP。 别忘了localhost。

 127.0.0.1 localhost example.com mail.example.com 192.168.1.100 #(IP address of your server, if applicable) 

(可能不需要上面的最后一行。如果你有一个要添加的IP地址,请确保你使用自己的IP地址,而不是上面的例子。)

编辑/etc/default/opendkim

取消注释此行并使用端口8891:

 SOCKET="inet:8891@localhost" # listen on loopback on port 

确保您的防火墙(iptables)允许在localhost上进行环回:

 sudo iptables -A INPUT -i lo -j ACCEPT 

接下来,使用文本编辑器/etc/opendkim/KeyTable创建一个文件,并将域添加到KeyTable

添加行:

 #EXAMPLE showing my 2nd key: my_selector._domainkey.example.com example.com:my_selector:/etc/opendkim/my_selector.private 

下一步使用文本编辑器/etc/opendkim/SigningTable创建文件,并将域添加到SigningTable

我展示了两个例子。 请注意,对于我的第二个密钥,我现在必须使用完整的域名“mail.example.com”:

 example.com 201205._domainkey.example.com mail.example.com my_selector._domainkey.example.com 

请注意,在OpenDKIM 2.0.1中,域名区分大小写。 在这个例子中,我们使用的是较新版本的OpenDKIM,这似乎不是问题。

配置postfix。 编辑/etc/postfix/main.cf并将行添加到末尾

 milter_default_action = accept milter_protocol = 2 smtpd_milters=inet:localhost:8891 non_smtpd_milters=inet:localhost:8891 

还要更改主机名:

 #myhostname = localhost #original myhostname = mail.example.com 

您还应该更改/ etc / hosts中的相应条目。 这些更改在重新启动后有效(尽管您可以使用以下命令立即设置: hostname NEW_NAME )。

如果你没有重启,请重新启动postfix和opendkim:

 # service opendkim restart Restarting OpenDKIM: opendkim. # service postfix restart * Stopping Postfix Mail Transport Agent postfix [ OK ] * Starting Postfix Mail Transport Agent postfix [ OK ] 

测试

检查您的签名邮件是否经过身份validation以及您的DNS记录是否已正确设置的最佳方法是使用其中一种免费测试服务。 我用过这些:

  • Brandon Checketts电子邮件validation器 – http://www.brandonchecketts.com/emailtest.php (我最喜欢的)
  • 发送一封签名的电子邮件至:check-auth@verifier.port25.com(我也最喜欢)
  • 发送签名的电子邮件至:sa-test@sendmail.net(您可以将所有测试电子邮件地址放在单个外发邮件的“收件人:”字段中进行测试)

  • 发送一封签名的电子邮件至:autorespond+dkim@dk.elandsys.com <--- BROKEN !!! 不要使用这个。

这些中的每一个都会告诉您事情是否正常,并在必要时给出一些关于故障排除的指示。

如果您有Gmail帐户,还可以在那里发送签名邮件,以便快速轻松地进行测试。

一旦你感到满意,你可以删除DNS TXT记录中的测试标志并增加TTL。

完成!

这是一个很好的指南。

它解释了确实推荐使用opendkim,并且实现dkim签名的步骤与dkim-filter相同。

dkim-milter不再开发。 它的原始作者已经分享了源代码,现在正在开发opendkim。 对于Lucid和更高版本,opendkim优于dkim-filter。 此页面上的说明应该相同(只需根据需要调整包名称)。

BTW Domainkeys是DKIM不推荐使用的前身。 将TXT记录添加到您的DNS区域以获取SPF和DKIM,但不再需要使用Domainkeys。

http://wiki.zimbra.com/wiki/Configuring_for_DKIM_Signing

我总是确保在任何事情上交叉参考指南。 设置工作的这个啧啧,我刚刚validation了它并validation了这一点。 但是,您可能希望显示要详细记录的域记录的示例TXT。 人们可能会感到困惑并明确地将密钥本身的所有内容都放入p值中,我并不完全确定这是正确的。 即……包括—–开始公共密钥—–和—–结束公共密钥—–。 这可能会让一些人感到困惑。 只需确保只加密部分而不是标记。

Interesting Posts