前几天在 Google Plus 上看到 Linus 在吐槽很多人的邮箱没有设置 DKIM 签名,并且很多人即使设置了 DKIM ,但是配置也是有问题的,发出去之后的结果是验证不通过的。我也是第一次听过这个 DKIM,经过这两天在 google 阅读多份资料之后算是理解了,所谓的 DKIM 就是向收件人表明我的这封邮件是我自己发的,而且内容不是垃圾邮件。

DKIM 的原理其实还是非对称加密算法,只不过是将公钥放置到了 DNS 服务器处,因为邮箱地址解析是需要通过 DNS 的 MX 记录来进行的,所以讲公钥内容放在 DNS 中可以不用从其他地方传输公钥,直接从 DNS 上按需获取即可,整个 DKIM 验证过程如下:

图 1:DKIM 验证过程

通过这个过程就保证了邮件一定是我发的,而且由于我的良好记录,这封邮件肯定不会被纳入垃圾箱,那么下面就说下具体的操作过程。

设置 DKIM

首先,想说一下我的环境,我用的是自建邮箱,也就是说我的邮箱服务器是自己的,如果你使用的 outlook/gmail 的话,微软和谷歌都是提供 DKIM 的服务的,可以参考本文的解释大致相同的设置,可能会比本文讲得更简单一些。

1. 创建公私钥

因为是公私钥,所以我们用的还是 RSA 非对称加密算法,需要说明一下的是,默认使用的是 2048 位密钥长度,如果你的 DNS 提供商不支持 2048 位的话,那么可以选择 1024 位;然后生成 RSA 钥匙对的工具还是老朋友 openssl

  1. $ openssl genrsa -out rsasec.pem

就在你的当前目录产生了一份私钥了,然后创建一份公钥出来:

  1. $ rsa -out rsapub.pem -in rsasec.pem -pubout

同样,在当前目录也生成了公钥: rsapub.pem

2. 在 DNS 中设置公钥

因为我使用的 DNSPOD,所以直接登录 DNSPOD 后台控制台,然后添加一条 TXT 记录,内容这可以这么写:

图 2:TXT 记录

其中具体内容为:

主机记录: @._domainkey.liuliqiang.info # 这里讲 liuliqiang.info 换成你的 域名
记录类型: TXT
记录值: k=rsa; p=公钥内容

这里的公钥内容是 rsapub.pem 文件中 “——-BEGIN PUBLIC KEY——-” 和 “——-END PUBLIC KEY——-” 之间的内容,例如 rsapub.pem 里面的内容是:

  1. -----BEGIN PUBLIC KEY-----
  2. abc
  3. -----END PUBLIC KEY-----

那么,这里的公钥内容就是 “abc” 了。

然后保存就可以了。

3. 在客户端设置 DKIM

4. 验证签名效果

方法一
目前 gmail 邮箱是支持签名验证的,所以我们可以发送一封邮件到 gmail 邮箱来验证签名是否生效。如下图

图 3:gmail 验证签名

方法 二

也可以发送给 sina 邮箱或者网易邮箱来判定DKIM签名是否有效。判断方法:收到邮件后,查看邮件的邮件头,如果显示 dkim=pass 则说明 DKIM 签名正确有效。

Reference