Postfix的傳輸層安全協(xié)議(TLS)
Postfix對于tls得支持,由lutz janicke所寫得一組修補文件提供。從postfix主頁得add-on software鏈接處可以取得這組修補文件。如果你使用平臺隨附得預編譯版postfix包,請確定該版本確實包含tls patch。
除 了postfix本身要支持tls之外,你還必須制作、設定tls證書。你需要一個公鑰(public key)與一個私鑰(private key)。公鑰是代表服務器身份得證書,你必須向具有一定信譽得認證中心(certificate authority,ca)提出申請,他們依據(jù)你得申請書向你求證之后,會以他們自己得數(shù)字簽名簽署一個公鑰給你,只要客戶端愿意相信ca得簽名,就等于 間接相信ca核發(fā)得公鑰所證明得系統(tǒng)--你得服務器。除了你自己的證書外,你還必須取得ca的公鑰(核發(fā)證書給你的那一家ca)。
對電子交易而 言,讓買方能夠證明賣方身份是很重要的。因此,網(wǎng)絡交易商確實有必要花錢取得ca的簽名。然而,就保密通信而言,服務器公鑰是否來自有公信力的ca,并不 是絕對必要的事,這表示你可以自己扮演ca的角色,自己核發(fā)證書給自己。當客戶端mua連接到你的tls server時,如果不認識你使用的ca證書,mua通常會提供一個機會給用戶,讓用戶自己決定要不要相信這個ca以及是否將ca的證書納入認同名單中。
tls證書
postfix tls patch需要用到openssl函數(shù)庫。openssl包隨附了一組管理證書的命令行工具,你可用這些工具來制作證書。就postfix而言,所有證書 都必須是pem格式。openssl工具的默認輸出格式剛好就是pem,所以不用任何轉(zhuǎn)換就可產(chǎn)生postfix可用的證書。openssl工具的默認安 裝目錄位于/usr/local/ssl,管理證書所需的命令行工具是openssl。
自己開設認證中心
服務器端證書必須要經(jīng)過ca的簽署才有效。你可以付費請有公信力的ca為你簽署,不過,就保密用途而言,你并不需要花這筆錢。openssl包提供了一個腳本,讓你可以自己開設ca,自己簽署自己的證書。在openssl的安裝目錄下,鍵入下列命令:
misc/ca.pl -newca
然后回答所有問題,完成之后,它會在./democa/目錄下產(chǎn)生開設ca所需的全部文件,其中包括可用來簽署證書的“ca數(shù)字簽名”(又稱為“根證書”)
tls證書概述
tls 使用公鑰加密技術(shù),讓client/server之間能夠進行私密通信。此外,tls能保證沒有人能夠在傳輸中途篡改信息,或是冒名偽裝成某一方,因為協(xié) 議本身容許通信雙方相互驗證彼此的身份。然而,再次提醒tls的好處僅限于tls聯(lián)機兩端,至于數(shù)據(jù)在傳輸之前發(fā)生過什么事,以及在傳輸?shù)侥康牡刂髸?怎樣處理,tls都無法保證。
公鑰加密技術(shù)的原理,是運用一對互補的key,其中一個可以公開給眾人知道,稱為“公鑰”;而另ygie key則只能由個人擁有,決不可泄漏,所以稱為“私鑰”或“密鑰”。公鑰加密的數(shù)據(jù),只可由私鑰予以解密,反之亦然。利用這種特性,公鑰可用來讓別人傳輸 私密數(shù)據(jù)給你,而你可用私鑰來證明自己的身份。當別人要傳遞機密數(shù)據(jù)給你時,對方可使用你事先提供的公鑰來加密數(shù)據(jù),由于只能用你自己的私鑰予以解密,所 以不怕機密數(shù)據(jù)泄漏(除非你泄露自己的私鑰)。私鑰又如何用來證明自己的身份?你可用自己的私鑰加密一份數(shù)據(jù)(這動作稱為“簽名”),如果對方能用你的公 鑰解開,表示數(shù)據(jù)一定來自于你,不可能是別人(除非你把自己的密鑰泄露給別人)。因此,你的密鑰可視為你個人的數(shù)字簽名。一般而言,你應該盡可能將公鑰散 布出去,而密鑰則必須不及一切代價予以保護。
當你收到別人的公鑰時,你如何能夠相信,公鑰的擁有者確實是對方所宣稱的那個人?實際上,公鑰散布 時,往往會同時散布一個代表公鑰擁有者的標識符--通常是服務器的主機名稱。收到公鑰的一方,可通過比對此標識符是否與dns查出的主機名稱吻合,借此確 認公鑰的擁有者確實是當前的聯(lián)機對象。
有ca數(shù)字簽名,稱為證書。ca通常是交易雙方都信任的第三方組織。理論上,有ca的證明,表示公鑰擁有者 的身份已經(jīng)被ca調(diào)查并予以證實,取得公鑰的人,可以相信該公鑰確實屬于其宣稱的擁有者。換言之,證書的授信基礎(chǔ)來自于你對ca的信任。值得注意的是, ca只擔保證書擁有者的身份,而不是擔保其信用。
在加密通信的過程中,公私鑰僅用于聯(lián)機初期,讓雙方互相確定對方的身份,并協(xié)商出一個隨機產(chǎn)生的 session key,實質(zhì)的通信內(nèi)容,其實是由這個session key來加密與解密。一個session key只用於一次通信,在通信完畢之后,session key就可以丟掉了。
讓我們看看client與server之間是如何進行秘密通信的。首先,client聯(lián)機到server,并提出秘密通信要求。對于web server,client使用https命令;對于smtp server,client發(fā)出starttls命令。
如 果server同意請求,便會返回一個由ca簽署的證書,其中含有ca的數(shù)字簽名以及一個代表server的標識符。client檢驗server的標識 符是否符合預期,并檢查該ca的數(shù)字簽名是否在認同名單中。如果兩項檢查都過關(guān),client與server雙方便開始展開session key協(xié)商,決定后續(xù)通信內(nèi)容要使用哪一種加密算法,并產(chǎn)生一個只用於該次通信的session key。接著,雙方便使用協(xié)議出來的session key與算法進行秘密通信。
產(chǎn)生服務器端證書
產(chǎn)生服務器端證書的第一步,是使用openssl工具為服務器產(chǎn)生一對公鑰與私鑰, 然后產(chǎn)生一個“證書簽署請求”(certificate signing request, csr),并將csr與公鑰交給ca簽署。經(jīng)過ca簽署的公鑰證書可以廣泛散布出去,但是私鑰則必須被謹慎保管。事實上,有許多應用系統(tǒng)將私鑰加密封存在 一個特殊文件,在訪問私鑰之前,必須先提供密碼(passphrase)才能解密,這種儲存私鑰的方法稱為“密封”。然而,postfix需要能夠直接訪 問私鑰,不能使用密封方法,因為訪問私鑰的動作發(fā)生在運行時,而此時你不可能實時提供密碼。
openssl包提供一組腳本可幫助你產(chǎn)生公私鑰與csr,不過,它們所產(chǎn)生的key是“密封”的,所以,你得直接使用openssl命令來產(chǎn)生公私鑰:
openssl req -new -nodes -keyout mailken.pem -out mailreq.pem -days 365
openssl得-new選項表示你想產(chǎn)生公私鑰與csr,-nodes選項表示不加密,-keyout和-out分別指出私鑰文件與csr文件得名稱。最后,-days 365指出證書得有效期限是一年。
如果你使用第三方ca,請按照ca得指示,提出你得csr來要求他們簽署。如果你自己扮演ca得角色,你可用下列命令來核發(fā)證書:
openssl ca -out mail_signed_cert.pem -lnfiles mailreq.pem
此步驟所產(chǎn)生得mail_signed_cert.pem文件,就是ca所核發(fā)得證書。
你可能會想要將postfix/tls用到得所有證書文件復制到一個方便得位置。假設你完全依照上述得步驟,則請用下列命令將證書文件復制到postfix的配置目錄下:
cp /usr/local/ssl/mailkey.pem /etc/postfix
cp /usr/local/ssl/mail_signet_cert.pem /etc/postfix
mailkey.pem文件存有服務器的密鑰,mail_signed_cert.pem是ca簽署的公開證書。由于postfix不能使用密封的私鑰文件,所以你應該以最嚴格的權(quán)限模式來保護私鑰文件:
chown root /etc/postfix/mailkey.pem
chmod 400 /etc/postfix/mailkey.pem
上述命令將私鑰文件的擁有權(quán)判給root賬戶,而且只有root能夠讀取。
安裝ca證書
postfix/tls server必須要能夠訪問ca的公開證書(也就是所謂的“根證書”),包括為你的服務器簽名的那一個ca以及核發(fā)證書給你的用戶的每一個ca。當然,如果雙方使用同一個ca,則只需要安裝一個根證書就夠了。
如果你的服務器端證書是自己簽發(fā)給自己的,請將先前的ca.pl腳本所產(chǎn)生的cacert.pem文件復制到postfix的配置目錄:
cp /usr/local/ssl/democa/cacert.pem /etc/postfix
如果你的服務器或任何客戶端的證書是第三方ca所簽發(fā)的,你必須設法取得這些ca的根證書(pem格式);對于你不信任的ca,自然沒必要取得他們的根證書。請將搜集到的所有根證書集中在/etc/postfix/cacert.pem文件里。
有 兩種方法可將新的ca根證書安裝到postfix/tls系統(tǒng)。第一種辦法是將所有根證書集中在一個文件,并將smtpd_tls_cafile參數(shù)指向 此文件。你只需將新的根證書附加在現(xiàn)有文件末端即可。比方說,若原有的ca根證書是存儲在/etc/postfix/cacert.pem文件中,而新 ca的根證書是存放在newca.pem文件中,那么,下列命令可將新的根證書納入認同名單:
cp /etc/postfix/cacert.pem /etc/postfix/cacert.pem.old
cat newca.pem >> /etc/postfix/cacert.pem
另一種方法是將每個ca的根證書全部集中一個專用目錄下的個別文件里,并將smtpd_tls_capath參數(shù)指向此目錄。以后,每當需要安裝新的ca根證書時,只要將新的證書文件存放在此目錄下,然后執(zhí)行一次openssl的c_rehash命令即可。
當你有許多ca根證書要處理時,這種方法可讓維護工作稍微輕松些;不過,如果你的postfix是在chroot環(huán)境下運行,則還需要將新的根證書文件復制到chroot環(huán)境下的對應目錄,然后運行postfix reload,新證書才會有效。
設定postfix/tls
postfix tls patch引進了一組關(guān)于tls運作環(huán)境的參數(shù)。本小節(jié)只列出基本配置所需的關(guān)鍵參數(shù),至于完整的tls參數(shù)說明,請參閱tls patch隨附的配置文件樣本。
smtpd_use_tls
啟動tls支持。如果沒有設定此參數(shù)或是設定成no,postfix的運行方式就像沒有tls patch一樣。例如:
smtpd_use_tls = yes
smtpd_tls_key_file
指向服務器私鑰文件。例如:
smtpd_tls-key_file = /etc/postfix/mailkey.pem
smtpd_tls_cert_file
指向服務器的pem證書文件(必須經(jīng)過ca簽署)。例如:
smtpd_tls_cert_file = /etc/postfix/mail_signed_cert.pem
smtpd_tls_cafile
指向ca根證書文件。該文件含有所有你愿意信任的ca的公開證書。例如:
smtpd_tls_cafile = /etc/postfix/cacert.pem
smtpd_tls_capath
指向ca根證書文件目錄。該目錄下的每個pem文件,都含有一個你信任的ca公開證書。例如:
smtpd_tls_capath = /etc/postfix/certs
將上述參數(shù)設定到main.cf配置文件,并運行postfix reload之后,你的postfix/tls server將具備秘密通信的能力,并準備迎接客戶端的starttls命令。
#p#
postfix/tls的設定過程整理
總結(jié)前述的基本知識,在postfix系統(tǒng)上設定tls的大致過程如下:
1、安裝openssl包,因為我們需要使用該軟件包來產(chǎn)生tls證書。
2、使用tls patch,并重新編譯、安裝postfix。
3、產(chǎn)生一份服務器端證書以及一個證書簽署請求(csr)。然后將兩者一并提交給有一定信譽的ca請求簽署;或是自己扮演ca的角色,自己核發(fā)證書給自己。
4、將所有證書文件(服務器的密鑰、csr、ca的根證書)安裝在postfix目錄下。
5、編輯main.cf,設定下列tls參數(shù):
smtpd_use_tls = yes
smtpd_tls_key-file = /etc/postfix/mailkey.pem
smtpd_tls_cert_file = /etc/postfix/mail_sigend_cert.pem
smtpd_tls_cafile = /etc/postfix/cacert.pem
如果還需要設定其他tls參數(shù),現(xiàn)在正是時候。
6、重新加載postfix,使我們在main.cf所做的改變生效。
現(xiàn)在,每當有客戶端要求秘密通信,postfix/tls server都能適當應對。
取得客戶端證書
你可能會想要使用客戶端證書來代替或加強其他smtp驗證技術(shù)??蛻舳俗C書是非??煽康尿炞C方法,因為其非常難以假造。
客戶端證書必須由ca核發(fā)。如果你打算選擇一個ca來核發(fā)證書給你的用戶,你應該遵照該ca的申請過程來取得客戶端證書。當然,你也可以使用openssl包提供的工具,自己扮演ca的角色,自己簽發(fā)證書給用戶。
制作客戶端證書
客戶端證書的制作程序,其實與服務器端證書的制作過程很相似,唯一差別是多了一個步驟:將簽署好的證書換成mua可用的格式。大部分流行的mua都偏好 pkcs12格式的證書文件,這種格式將簽署好的證書與私鑰封裝在一起,并以一個密碼保護。如果你使用第三方ca,該ca應該能提供正確格式的證書文件來 滿足用戶的mua。如果你自己簽署證書,你應該制作pkcs12格式的證書文件來分發(fā)給用戶。證書文件應該包含核發(fā)給用戶個人的證書(公鑰)、搭配于該證 書的私鑰以及你自己的ca根證書。
對于每一位你打算以證書來驗證其身份的用戶,你都必須分別產(chǎn)生一對專屬的公私鑰。你應該指定“辨別名稱”的命名原則。一般而言,在產(chǎn)生證書時,你應該使用 個人的郵件地址或是客戶端機器的主機名稱。舉例來說,假設你決定以郵件地址為分辨名稱,而現(xiàn)在要簽發(fā)證書給kdent@ora.com這位用戶,步驟如 下:
1、使用openssl命令產(chǎn)生一對公私鑰。請注意,你自己的公鑰也必須有ca的簽名
openssl req -new -nodes -keyout kdentkey.pem -out kdentreq.pem -days 365
由于使用了-new選項,所以上述命令會產(chǎn)生一個私鑰與一份csr。-nodes選項要求openssl不要將私鑰密封。-keyout和-out分別指出私鑰文件和csr的文件名。最后,-days 365表示證書的有效期是一年。
2、簽署證書。如果你與ca合作,請按照他們的申請流程,提出前一步驟所產(chǎn)生的csr,要求他們簽署。如果你自己作為ca,請用下列命令簽署證書:
openssl ca -out kdent_signed-cert.pem -infiles kdentreq.pem
3、將簽署好的證書文件轉(zhuǎn)換成適當格式。問清楚用戶所用的mua是哪一種,將ca簽章的證書文件轉(zhuǎn)換成該mua能接受的格式:
openssl pkcs12 -in kdent_sigend_cert.pem -inkey kdentkey.pem -certfile /etc/postfix/cacert.pem -out kdent.p12 -export -name "kdent@ora.com"
這命令會要求你提供一個密碼來保護所產(chǎn)生的文件(kdent.p12),而你必須將這個密碼告知用戶。-certfile選項指出你自己的ca根證書文件。完成之后,就可將kdent.p12文件與腳本交付給用戶。
最后一步,請用戶自己將證書文件安裝道m(xù)ua。大多數(shù)mua都提供相當簡便的步驟來導入證書文件,所以應該不成問題。如果你有不擅長操作計算機的用戶,請給予適當?shù)闹笇А?/p>
設定客戶端證書驗證
postfix/tls依據(jù)證書的“指紋”來判別證書是否可接受。“指紋”是從證書中計算出來的值,不同的證書,不可能計算出相同的指紋。你必須將每個客 戶端證書的指紋都存放于一個標準的postfix查詢表。每當有客戶端出示其證書,postfix/tls就計算該證書的指紋,然后檢查該指紋是否已登記 在查詢表,借此決定是否要容許客戶端使用轉(zhuǎn)發(fā)服務。
你必須收集每一位獲得授權(quán)的客戶端的證書指紋。許多mua都有顯示證書指紋的功能,你可以要求用戶將他們在mua看到的證書指紋提供給你。如果他們的證書是你自己核發(fā)的,你可以用openssl x509命令直接算出指紋:
openssl x509 -fingerprint -noout -in kdent_signed_cert.pem | cut -d -f2
整個設定流程如下:
1、分別取得每一位用戶的證書指紋。你可以按照上述步驟自己計算,或是要求用戶提供給你。
2、將收集道的指紋集中在/etc/postfix/clientcerts文件,并注明其對應的辨別名稱。
3、將制作好的clientcerts查詢表轉(zhuǎn)換成數(shù)據(jù)庫:
postmap /etc/postfix/clientcerts
4、編輯main.cf配置文件,加入下列參數(shù):
relay_clientcerts = hash:/etc/postfix/clientcerts
smtpd_tls_ask_cert = yes
smtpd_recipient_restrictions =
permit_mynetworks
permit_tls_clientcerts
reject_unauth_destination
5、重新加載postfix,使我們在main.cf所做的改變生效:
postfix relaod
tls/smtp client的設定過程
既然smtp/tls server能要求客戶端出示證書,那么,當postfix扮演客戶端角色時--寄信到其他smtp server,或要求其他smtp server轉(zhuǎn)發(fā)郵件--smtp mda也可能被要求提供客戶端證書。注意,一個postfix系統(tǒng)只能有一個代表自己的客戶端證書,除非你在master.cf中設定了其他mda,才有 可能安裝多個的客戶端證書。
證明服務器端身份的證書,也可以用來證明客戶端身份。不過,正式ca核發(fā)的證書,不見得能讓你同時用在兩種身份上。這種情況下,你可能需要向ca另外申請 一個客戶端證書。我們先前制作的自簽名服務器證書沒有這樣的限制。不管你的客戶端證書是怎么來的,其辨別名稱都必須符合myhostname參數(shù)所指定的 主機名稱。
制作客戶端證書的過程,其實與服務器端證書的制作過程完全一樣,所以不再贅述。如果你打算使用同樣的證書,那么,只要將幾個tls client參數(shù)指向tls server參數(shù)所用的相同文件即可。
以下是最基本的tls client參數(shù)。
smtp_use_tls
啟動postfix smtp client的tls支持。
smtp_use_tls = yes
smtp_tls_key_file
指向客戶端證書所對應的私鑰文件。
smtp_tls_key_file = /etc/postfix/mailkey.pem
smtp_tls_cert_file
指向客戶端證書文件。
smtp_tls_cert_file = /etc/postfix/mail_signed_cert.pem
smtp_tls_cafile
簽署客戶端證書的ca的根證書文件,例如:
smtp_tls_cafile = /etc/postfix/cacert.pem
假設你打算讓smtp使用與smtpd相同的證書,設定步驟相當簡單:
1、編輯main.cf,設定下列參數(shù):
smtp_use_tls = yes
smtp_tls_key_file = /etc/postfix/mailkey.pem
smtp_tls_cert_file = /etc/postfix/mail_signed_cert.pem
smtp_tls_cafile = /etc/postfix/cacert.pem
2、重新加載postfix,使main.cf的改變生效;
postfix reload
現(xiàn)在,每當postfix聯(lián)機到一個妖氣出示客戶端證書的smtp server,smtp便會提供必要的信息。
通過閱讀本文,想必大家都知道了在Postfix里傳輸層安全協(xié)議是怎么安裝、整理和設定的,希望對大家有所幫助!
【編輯推薦】
- Postfix sasl身份驗證功能
- Postfix利用擋信機制來消除垃圾郵件的隱患
- Postfix的投遞過程詳解
- Postfix里的POP與Imap介紹
- PostfixAdmin 配置過程講解
- 如何安裝PostfixAdmin
- 8.2.3 SSL與TLS
- OpenSSL:最好的SSL TLS加密庫