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/,就可以看到測試的結果:
接著,可以鼓起勇氣寄信到 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 簡單很多,在另外的文章中說明。