我的烏拉拉練功坊

請來參觀移植到 Google Firebase 的成績 https://oolala.xyz/ken73chen/

2014年6月23日

搭配 Postfix 設定 DKIM


DKIM 是 DomainKeys Identified Mail,是從 DomainKeys 演變來的,這篇文章說明如何設定外送信件的時候,會加上 DKIM 的簽名,關於 DKIM ,可以參考 Yahoo 的說明http://www.dkim.org/,這東西雖然 Yahoo 率先使用,不過 Gmail 等郵件系統,也是會判讀 DKIM 的。

首先安裝 OpenDKIM
root@foo:/usr/local/etc # pkg install -f opendkim
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
The following 1 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
 opendkim: 2.10.3_7

Number of packages to be installed: 1

The process will require 1 MiB more space.
309 KiB to be downloaded.

Proceed with this action? [y/N]: y
[1/1] Fetching opendkim-2.10.3_7.txz: 100%  309 KiB 316.5kB/s    00:01    
Checking integrity... done (0 conflicting)
[1/1] Installing opendkim-2.10.3_7...
Extracting opendkim-2.10.3_7: 100%
Message from opendkim-2.10.3_7:

************************************************************************

In order to run this port, write your opendkim.conf and:

if you use sendmail, add the milter socket `socketspec' in
/etc/mail/<your_configuration>.mc:

INPUT_MAIL_FILTER(`dkim-filter', `S=_YOUR_SOCKET_SPEC_, F=T, T=R:2m')

or if you use postfix write your milter socket `socketspec' in
/usr/local/etc/postfix/main.cf:

smtpd_milters = _YOUR_SOCKET_SPEC_


And to run the milter from startup, add milteropendkim_enable="YES" in
your /etc/rc.conf.
Extra options can be found in startup script.

Note: milter sockets must be accessible from postfix/smtpd;
  using inet sockets might be preferred.

************************************************************************
如果沒有裝 openSSL 的話,請先安裝,或者你要用其他方法產生 key 也是可以的,接著產生 SSL 的 key:
root@foo:/etc/pam.d # cd /usr/local/etc/postfix/
root@foo:/usr/local/etc/postfix # open
root@foo:/usr/local/etc/postfix # openssl genrsa -out private.key 1024
Generating RSA private key, 1024 bit long modulus
.......++++++
....................++++++
e is 65537 (0x10001)
root@foo:/usr/local/etc/postfix # openssl rsa -in private.key -pubout -out public.key
writing RSA key
root@foo:/usr/local/etc/postfix # cat public.key
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDtwwWbCS5tTzHZU/eQkMQBbQrs
xHPQd2TI8VAVLBiNw/SJF8hcZr8bjSJ8IAacTdu583xnjgU/GhTTCOjLAJipR5Z/
Uydik7kXVWkXuCRh5ue0lH5cnxm6ppyvlJKG0r8eLY0KJbGGNX5H3tn0ze798qeX
akrw0TQbxYDZ4aNNdwIDAQAB
-----END PUBLIC KEY-----
先選擇一個「selector」的名稱,例如就是 selector,然後,修改 DNS 的設定,要把 public key 放到 DNS 中,放好以後變成這個樣子:
selector._domainkey.foo.com.    1799    IN    TXT    "k=rsa; t=s; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDtwwWbCS5tTzHZU/eQkMQBbQrsxHPQd2TI8VAVLBiNw/SJF8hcZr8bjSJ8IAacTdu583xnjgU/GhTTCOjLAJipR5Z/Uydik7kXVWkXuCRh5ue0lH5cnxm6ppyvlJKG0r8eLY0KJbGGNX5H3tn0ze798qeXakrw0TQbxYDZ4aNNdwIDAQAB"
前頭的 selector 就是剛剛選擇的 selector,後面加上 _domainkeys,然後 foo.com 是你的 domain,記得先縮短 TTL 的設定,這樣設定錯了,重新修改 DNS 後,就不用等太久。

修改 postfix 的設定,修改 /usr/local/etc/postfix/main.cf 這個檔案,加上以下兩行:
smtpd_milters = local:/tmp/opendkim.sock
milter_default_action = accept
修改 rc.conf:
milteropendkim_enable="YES"
milteropendkim_uid="postfix"
milteropendkim_flags="-vvW -b s"
milteropendkim_socket="local:/tmp/opendkim.sock"
milteropendkim_domain="foo.com"
milteropendkim_key="/usr/local/etc/postfix/private.key"
milteropendkim_selector="selector"
milteropendkim_alg="rsa-sha256"
理論上就大功告成了,不過千萬不要急著寄信到 Gmail、Yahoo mail 去測試,以免設定有錯誤。

比較常出現的錯誤,就是沒有把 Postfix 裡面的預設 domain、hostname 改成你自己的名字,記得一定要改。

接著,隨便找一個專門測試  domain keys 的網站,例如我用的是 http://www.appmaildev.com/en/dkim/,這個網站很簡單,按下 Next Step,他會給你一個 mail address,就寄信給那個指定的 mail address 就可以了。

回到 http://www.appmaildev.com/en/dkim/,就可以看到測試的結果:


SPF 和 DKIM 都 pass 了,真是可喜可賀、可喜可賀!

接著,可以鼓起勇氣寄信到 gmail、yahoo mail 和 hotmail 去了。

在 gmail 中,看「顯示原始郵件」,應該就會看到:
Authentication-Results: mx.google.com;
       spf=neutral (google.com: root@foo.com does not designate permitted sender hosts) smtp.mail=root@foo.com;
       dkim=pass header.i=@foo.com
重點是 dkim=pass 那一行。 Yahoo 的信件,還是有可能被丟到垃圾信件匣裡面 (WTF!!),反正找到後,「觀看完整標題」,就可以看:
Authentication-Results: mta1008.mail.tp2.yahoo.com  from=foo.com; domainkeys=pass (ok);  from=foo.com; dkim=pass (ok) 

重點當然在「domainkeys=pass」。

當完成了 domain keys 的設定,建議您還是要設定 SPF,SPF 簡單很多,在另外的文章中說明