答案1
Ubuntu Server 12.04LTS 上的 openDKIM 和 Postfix
我会试着回来并更好地格式化它。但是因为有人要求发布我的答案,所以我想现在就发布它,而不是等到我有时间正确格式化它。由于时间不够,我将整个答案包裹在块引用中。我希望这个解决方案有用。
这些是我的参考资料:
man opendkim-testkey
man opendkim.conf
- http://www.serveridol.com/2012/02/17/opendkim-configuring-dkim-keys-on-postfix/
- http://stevejenkins.com/blog/2010/09/how-to-get-dkim-domainkeys-identified-mail-working-on-centos-5-5-and-postfix-using-opendkim/
- http://blog.example.com/tag/opendkim/
- http://blog.tjitjing.com/index.php/2012/03/guide-to-install-opendkim-for-multiple-domains-with-postfix-and-debian.html
和维基百科对该主题有很好的介绍
你至少需要:
- 获得邮件服务器的根访问权限
- 访问以更新您的域的 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 中)!其中 包含 ,;=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 报告称密钥不安全。这与我的 DNS 服务器上未实施 DNSSEC 有关,理论上有人可以拦截 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.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)允许本地主机的环回:
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 ]
测试
检查签名邮件是否经过身份验证以及 DNS 记录是否正确设置的最佳方法是使用免费测试服务之一。我使用了这些:
- Brandon Checketts 电子邮件验证器 -http://www.brandonchecketts.com/emailtest.php(我最喜欢的)
- 发送签名电子邮件至:[电子邮件保护](也是我最喜欢的)
发送签名电子邮件至:[电子邮件保护](您可以将所有测试电子邮件地址放在要测试的单个外发邮件的收件人:字段中)
发送签名电子邮件至:[电子邮件保护]<--- 坏了!!! 不要使用这个。
这些都会告诉您一切是否正常运行,并在必要时为您提供一些故障排除的指示。
如果您有 Gmail 帐户,您也可以向其发送签名邮件以进行快速简便的测试。
一旦您对一切顺利感到满意,您可以删除 DNS TXT 记录中的测试标志并增加 TTL。
完毕!
答案2
这是一个很好的指南。
它解释了 opendkim是确实推荐,并且实施 dkim 签名的步骤与 dkim-filter 相同。
dkim-milter 不再开发。它的原作者已经分叉了源代码,现在正在开发 opendkim。对于 Lucid 及更高版本,opendkim 优于 dkim-filter。此页面上的说明应该相同(只是根据需要调整了包名称)。
顺便说一句,Domainkeys 是 DKIM 的弃用前身。将 TXT 记录添加到您的 DNS 区域以用于 SPF 和 DKIM,但不再需要使用 Domainkeys。
答案3
http://wiki.zimbra.com/wiki/Configuring_for_DKIM_Signing
我总是确保交叉参考一些指南。这个设置教程有效,我刚刚验证了它,它验证了这个。但是,您可能希望显示一个示例 TXT 以详细说明域记录。人们可能会感到困惑,并明确地将密钥本身的所有内容放入 p 值中,我不完全确定这是否正确。即...包括 -----BEGIN PUBLIC KEY----- 和 -----END PUBLIC KEY----- 。这可能会导致一些人感到困惑。只需确保只放入加密部分而不是标记即可。