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


22

我正在使用Postfix和Mailman运行Ubuntu 12.04。我想设置DKIM。DomainKeys Identified Mail或DKIM是Yahoo的“ DomainKeys”的后继产品。它包含了思科的识别邮件。

设置步骤是什么?

是否推荐opendkim?

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

Answers:


39

Ubuntu Server 12.04LTS上的openDKIM和Postfix

我会尝试再将其格式化。但是由于有一个要求发布我的答案的请求,所以我想现在就发布它,而不是等到我有时间正确设置它的格式。由于时间不足,我将我的整个答案用大括号括起来。我希望此解决方案有帮助。

这些是我的参考:

维基百科对这个问题的很好的入门

至少您将需要:

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

从存储库安装opendkim:

# sudo apt-get install opendkim opendkim-tools

您必须决定要使用的“选择器”。选择器本质上是一个描述您要使用的键的单词。在这里,我将使用选择器201205,因为密钥在2012年5月生效(警告是eh?)。我举两个例子说明多样性,希望可以使它们更加清楚。您只需要生成一个密钥。但是,我给出两个示例,以便您可以进行比较。

  • 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中)!在包含的地方,;=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 (e.g. 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的实例)的opendkim.conf中。

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

添加应由OpenDKIM处理的域,主机名和/或IP。不要忘记本地主机。

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)允许在本地主机上进行环回:

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的较新版本,这似乎没有问题。

配置后缀。编辑/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 ] 

测试中

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

  • 布兰登Checketts电子邮件验证- http://www.brandonchecketts.com/emailtest.php(我的最爱)
  • 发送签名电子邮件至:check-auth@verifier.port25.com(也是我的最爱)
  • 将签名的电子邮件发送到:sa-test@sendmail.net(您可以将所有测试电子邮件地址都放在要测试的单个外发消息的“收件人:”字段中)

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

所有这些都会告诉您一切是否正常,并在需要时为您提供一些有关故障排除的提示。

如果您有Gmail帐户,也可以在该帐户中发送已签名的邮件,以便快速,轻松地进行测试。

一旦一切顺利,您就可以删除DNS TXT记录中的测试标记并增加TTL。

做完了!


精确地完美工作。很好的演练,谢谢。
Aki

使用-b 1024生成1024位的密钥。这是获得我的gmail签名的必要条件!
Prashant Singh

1
请注意,在opendkim.conf中,使用“ SigningTable”和“ KeyTable”时,三个参数“ Domain”,“ KeyFile”和“ Selector”将被忽略。不知道这是否改变了在某些时候,但值得一提的(opendkim.org/opendkim.conf.5.html
billynoah

0

是一个很好的指南。

它解释说,opendkim 确实建议和实施您的DKIM签名的步骤是一样的使用DKIM过滤器。

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

BTW Domainkeys是DKIM弃用的前身。将TXT记录添加到SPF和DKIM的DNS区域中,但不再需要为Domainkeys烦恼。


您链接的文章已过期。opendkim是现在使用的软件包。我正在努力进行设置...
Monica Cellio的MountainX 2012年

在您将服务器从Exim4切换到Postfix-Dovecot的过程中,我会根据您的经验进行更新,并会寻找最新的指南。
iainH

我发布了解决方案,但没有时间格式化它。欢迎您(或其他任何人)对其进行格式化。但是我的笔记内容非常广泛,因此我希望您能立即访问它们。我希望他们会有所帮助。
Monica Cellio的MountainX

-1

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

我总是确保交叉参考一些指南。这篇关于设置的教程,我刚刚进行了验证,并且验证了这一点。但是,您可能需要显示一个TXT示例,以详细说明域记录。人们可能会感到困惑,并明确地将密钥本身的所有内容都放入p值中,我并不完全确定这是正确的。即...包括----- BEGIN PUBLIC KEY -----和----- END PUBLIC KEY -----。这可能会使一些人感到困惑。只要确保只放入加密部分而不是标记即可。


3
欢迎来到Ask Ubuntu!尽管从理论上讲这可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。
Braiam 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.