FreeBSD設定TLS for sendmail

前文提到SASL, 設定使用SMTP AUTH機制, 由於Outlook使用的驗證是LOGIN, 為明文傳送帳號密碼(其實是使用Base64編碼), 並不安全! 所以, 我們要另外再加上安全通道(TLS)

在FreeBSD上的設定步驟也很少:
1. 取得根憑證, 用於TLS加密的憑證及私密金鑰(共3個檔)
2. 設定sendmail.mc, 加入對TLS的設定

--------------------------------
我參閱MyChat數位男女的文件來實作, 在很短的時間內就做好了。筆記如下:

1. 憑證可以買商用的, 也可以自己做。商用的好處是, 它預先把根憑證安裝在各種電腦作業系統中, 所以使用者不用安裝根憑證, 但是商用憑證要付錢, 而且憑證有期限, 也就是要一直付錢。相反地, 自己做憑證的好處就是不用付錢, 但要自己下點功夫, 學習如何做憑證, 而且使用者也要安裝我們做的根憑證。

自己做憑證的步驟:
(因為openssl已裝好, 所以不用安裝, 只要設定即可)
# mkdir /usr/local/CA
# cd /usr/local/CA
# mkdir certs crl newcerts private
# echo "01" > serial
# cp /dev/null index.txt
# cp /etc/ssl/openssl.cnf openssl.cnf
修改openssl.cnf檔案,將檔案中的第38行的路徑由./demoCA改成/usr/local/CA
再下以下指令, 先做一個根憑證(cacert.pem)出來
# openssl req -new -x509 -keyout private/cakey.pem -out cacert.pem -days 365 -config openssl.cnf
根憑證也是有期限的, 在這裡使用-days 365來設定期限為一年, 如果要正式使用, 請考量使用長一點的期限吧! 時間過得很快的。
指令下完, 會出現如下訊息, 請依說明填入, 主要要記得第一個填入的PEM pass phrase, 這是用來保密根憑證私鑰的密碼(後面會用到), 其他的部份請依畫面說明填入, 如果忘了也沒關係, 可以檢視憑證內容來取得。
Generating a 1024 bit RSA private key
..........................................++++++
....++++++
writing new private key to 'private/cakey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
...

接下來要產生TLS加密時要用的公私鑰(mycert.pem, mykey.pem)
# openssl req -nodes -new -x509 -keyout mykey.pem -out myreq.pem -days 365 -config openssl.cnf
# openssl x509 -x509toreq -in myreq.pem -signkey mykey.pem -out tmp.pem
# openssl ca -config openssl.cnf -policy policy_anything -out mycert.pem -infiles tmp.pem
# rm -f tmp.pem

再將根憑證及公私鑰放到合適的地方(/etc/mail/cert目錄下):
# mkdir /etc/mail/cert
# cp /usr/local/CA/mykey.pem /etc/mail/cert/
# cp /usr/local/CA/mycert.pem /etc/mail/cert/
# cp /usr/local/CA/cacert.pem /etc/mail/cert/
# chmod og-rwx /etc/mail/cert/mykey.pem
# chmod og=r /etc/mail/cert/mycert.pem
# chmod og=r /etc/mail/cert/cacert.pem

並建立根憑證的連結
# cd /etc/mail/cert
# ln -s cacert.pem `openssl x509 -noout -hash < cacert.pem`.0

*注意: 在建立公私鑰的地方, 要小心設定CN(Common Name)的值, 最好是設為主機的FQDN, 否則Client端軟體, 在每次寄信時, 會出現警告訊息, 很令人困擾!

2. sendmail.mc的設定
在sendmail.mc中加入以下幾行:
define(`CERT_DIR',`/etc/mail/cert')dnl
define(`confCACERT_PATH',`CERT_DIR')dnl
define(`confCACERT',`CERT_DIR/cacert.pem')dnl
define(`confSERVER_CERT',`CERT_DIR/mycert.pem')dnl
define(`confSERVER_KEY',`CERT_DIR/mykey.pem')dnl
define(`confCLIENT_CERT',`CERT_DIR/mycert.pem')dnl
define(`confCLIENT_KEY',`CERT_DIR/mykey.pem')dnl

3. 記得將sendmail.mc編成sendmail.cf, 再重開sendmail。
# cd /usr/local/share/sendmail/cf/cf
# ./Build sendmail.cf
# ./Build install-cf
# cd /usr/local/etc/rc.d
# ./sendmail.sh restart

4. Outlook部份, 在設定帳戶時, 就可以把SMTP連線的安全協定選成TLS; Outlook Express就選成SSL。另外要安裝根憑證, 使用FTP之類的方法把主機的根憑證(cacert.pem)取出, 改名成cacert.cer(因為Windows會看副檔名, 改名後比較方便)再利用mmc指令, 找到憑證管理界面, 並滙入該檔案成為信任的根憑證。此時再寄信, 就可以成功使用TLS。如果憑證的CN值設定為該主機的FQDN, 而且根憑證也滙入的話, 就不會看到警示訊息。可以看寄出的信標題中, 多了(version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=NO)這個字串。

留言

這個網誌中的熱門文章

D-BUS學習筆記

Cisco Switch學習筆記: EtherChannel

Cisco Switch學習筆記: interface的封包錯誤統計