精華區beta FreeBSD 關於我們 聯絡資訊
※ 引述《[email protected] (雙雲)》之銘言: : 但是 ssl for smtp 一直有問題而且找不出原因。 下面是我參考別的文章,實作後的筆記,希望對您有幫助 測試平台:FreeBSD 4.5 Stable OpenSSL 版本:v0.9.6d 首先我們得先建立一個目錄,專門用來儲存所有憑證用的。 假設我們將憑證放在 /etc/ssl 之下,那麼我們就在 /etc 下建立一個名為 ssl 的子目錄,並且在 /etc/ssl 之下依序建立下列子目錄 certs crl newcerts private 然後,在 /etc/ssl 下建立兩個檔案,一個是 serial,另一個是 index.txt。 而 serial 的內容則是版本號,我們以 01 開始。指令如下 touch serial && echo 01 > serial touch index.txt 再來,請從你的 OpenSSL 安裝目錄找到 openssl.cnf 這支檔案。如果你是在 FreeBSD 中用 ports 安裝的,那麼請先找到 openssl.cnf.sample,拷貝一份 到 /etc/ssl 下,並更名為 openssl.cnf。編輯 openssl.cnf,找到下面這一段 [ CA_default ] dir = ./demoCA certs = $dir/certs crl_dir = $dir/crl database = $dir/index.txt new_certs_dir = $dir/newcerts certificate = $dir/cacert.pem serial = $dir/serial crl = $dir/crl.pem private_key = $dir/private/cakey.pem RANDFILE = $dir/private/.rand 將第一行的 dir = ./demoCA 改成 /etc/ssl(如果你是將憑證放在別的目錄, 請將 /etc/ssl 置換成你的目錄全名)。然後存檔,離開。 openssl.cnf 裡面設定了許多當我們執行 openssl 建立憑證時的參數,例如 編碼長度,預設名稱,有效期限等。有興趣者請自行詳加閱讀。 接下來,我們來建立自己的根憑證(以自己當認證中心,建立屬於此認證中心的 信任憑證)。請執行以下指令 openssl req -config openssl.cnf -new -x509 -keyout private/cakey.pem -out cacert.pem -days 365 我來解釋這一行的意義。 req : req 指令是用來建立或處理認證需求(certificate requests)用的。 它也可以用來建立自簽憑證(self signed certificates),自簽憑證 是供給認證中心用的。 -config openssl.cnf : -config 用來指定設定檔,這裡我們指定的是讀入 openssl.cnf。 -new -x509 : 原本的 -new 是用來產生一組認證需求(certificate request)用的, 將產生的認證需求交給認證中心,請認證中心產生憑證。而如今我們是 要為自己的認證中心簽署根認證,因此要加上 -x509 參數。 當 -new 加上 -x509 時,會產生一組自簽憑證。 當 -new 被使用時,並沒有搭配 -key 的話,那麼就會產生出一組私鑰 (private key)。如果 -new 與 -key 搭配使用的話,則只會產生出 認證需求。 -new 有一組變形的用法,-newkey。-newkey 可以同時產生認證需求與 一組私鑰。-newkey 後面接參數,參數有兩種規格,一種是 rsa:[nbit] 。這是用 RSA 編碼方式來產生私鑰,而 [nbit] 則是編碼長度。一般 編碼長度都是 1024,如果你覺得這還不夠,可以改成 rsa:2048 或更高 。另外一組參數是 dsa:[filename],這是用 DSA 編碼方式來產生私鑰 ,並且把私鑰的檔名設定為 [filename]。 -keyout private/cakey.pem : -keyout 將私鑰輸出到指定的檔案。這裡,我們將計算出的私鑰輸出到 private 下的 cakey.pem 這個檔案。 -out cacert.pem : -out 是用來將標準輸出(Standard Output)的內容重導至某個檔案中。 一般來說,標準輸出就是輸出到螢幕上。在這裡,最後的輸出就是自簽的 憑證(供給我們自己設立的憑證中心使用的),因此我們將標準輸出重導 至 cacert.pem 中。 -days 365 : -days 用來設定憑證的有效時限。以"天"為單位。這裡就是說這份憑證 有效時限為產生後 365 天內有效。 我是建議根目錄憑證的有效期限用長一點比較好。我比較過一些之名的 認證中心的根目錄憑證,短則三年,長則十年,很難得見到只有一年的 。因為時限太短,每年重簽一遍,就得重發一遍所有認證,很麻煩。 指令執行後,一開始 OpenSSL 會自行計算亂數,產生 key。當 Enter PEM pass phrase: 出現時,請輸入保護這個 Private Key 的密碼,OpenSSL 會要求你輸入兩次, 以確保沒有按錯鍵。之後會詢問你一些資訊,例如 Country Name 之類的訊息, 請自行依照情況輸入。由於這是根憑證,僅僅跟由這個根憑證發出的其他憑證 有關,因此這裡輸入的資料是什麼都沒關係。 做到這裡,我們已經擁有認證中心所需要的公鑰與私鑰了,可以開始進行「認證中心」 的其他工作了----開始發行其他憑證。 假設,我們有一台機器,名稱是 super.onlycat.idv.tw,而我們要發行一份憑證 給這台主機,讓它可以在 Apache 提供 SSL 連線服務用。那麼產生出這台主機 專用的憑證的作法是, 1. 執行以下命令 openssl req -config openssl.cnf -new -keyout private/catkey.pem -out catreq.pem -days 365 cat private/catkey.pem >> catreq.pem 此時會產生一個私鑰與憑證需求,過程中,首先 OpenSSL 會要求你輸入私鑰的密碼,然後 ,會要求你輸入一些資訊。請注意!!當你輸入到 Common Name (eg, YOUR name) []: 時 ,請輸入這台主機的完整制式網域名稱(FQDN),否則以後在使用時,會遭到瀏覽器警告 簽證中的名字與主機名稱不合的窘狀。以我們這個例子,當然是輸入 Common Name (eg, YOUR name) []:super.onlycat.idv.tw 產生完畢後,會有一個 catreq.pem,接下來,我們要用我們自己的「憑證中心」根據 這個檔案來簽署一個憑證。 2. 執行以下命令 openssl ca -config openssl.cnf -policy policy_anything -out catcert.pem -infiles catreq.pem ca 指令可以讓你做認證中心在做的事情 -- 接受憑證需求,然後發行一組憑證。 -config 與 -out 相信不需要再解釋了。 -policy policy_anything : -policy 是指產生憑證過程中所使用的政策。後面所接的參數,是在 openssl.cnf 中被定義的區段。如下 [ policy_anything ] countryName = optional stateOrProvinceName = optional localityName = optional organizationName = optional organizationalUnitName = optional commonName = supplied emailAddress = optional 預設上,openssl.cnf 中定義了兩個政策,一個是 policy_match,另一個就是 policy_anything。 其中,optional 是指選擇性的,可符合可不符合。match 表示一定要符合, 而 supplied 表示這個欄位是必填的。可以根據自己的需要設立新的政策, 並且指定使用。 -infiles catreq.pem : 這個參數需要放在整行指令的最後面。-infiles 是用來讀入包含認證需求 的檔案用的。 執行之後,我們將得到一個 super.onlycat.idv.tw 主機的憑證,catcert.pem。 此時,千萬別殺掉 catreq.pem,因為,如果你要 Qpopper 能跑 SSL/TLS 加密 的郵件傳輸的話,它會需要 catreq.pem。由於 catreq.pem 裡面也包含了私鑰, 所以也請好好保護這個檔案,不要外流。 現在,我們的主機 super.onlycat.idv.tw 有了完整的公私鑰,我們可以開始 玩一些支援 SSL 的服務了。 一,Sendmail Sendmail 支援 SSL/TLS 做全程的傳輸加密。很多人都知道 Sendmail 支援身份認證的功能,很好用,只要啟動身份認證功能,不管人在何方,都可以 透過這台伺服器發信到任何一個角落(再也不用管 MX 或 domain 還是host name 了)。但是大多數 e-mail client 雖然支援身份認證,可是傳輸密碼卻是 採用明碼傳輸,有被攔截的疑慮。此時若是傳輸過程可以再以 SSL/TLS 加密, 將可解決這個問題。 8.12.2 之後的 Sendmail 甚至支援私鑰是以 DES 演算法加密的。 使 Sendmail 支援 SSL/TLS 的重點,(請先安裝 Cyrus SASL 函式庫) 1. 解開 sendmail 原始碼封包之後,切換到原始碼路徑(例如是 /tmp/sendmail-8.12.3)下的 devtools/Site 下, 建立 site.config.m4, 內容如下 PREPENDDEF(`confMAPDEF', `-DMAP_REGEX') PREPENDDEF(`confOPTIMIZE', `-O2') APPENDDEF(`confENVDEF', `-DTCPWRAPPERS -DSASL -DSTARTTLS') APPENDDEF(`conf_sendmail_LIBS', `-lwrap -lsasl -lssl -lcrypto') APPENDDEF(`confLIBDIRS', `-L/usr/local/lib/sasl') <-----+ APPENDDEF(`confINCDIRS', `-I/usr/local/include/sasl') <-+ + 請依照 Cyrus SASL 函式庫安裝路徑修改 然後切換到原始碼目錄,執行 sh Build -c -f /tmp/sendmail-8.12.3/devtools/Site/site.config.m4 sh Build install 2. 切換到 cf/cf 目錄下,選擇符合 OS 的 .mc 檔案修改,檔案末加上 下列敘述 define(`CERT_DIR’, `/etc/ssl’)dnl define(`confCACERT_PATH’, `CERT_DIR’)dnl define(`confCACERT’, `CERT_DIR/cacert.pem’)dnl define(`confSERVER_CERT’, `CERT_DIR/certs/catcert.pem’)dnl define(`confSERVER_KEY’, `CERT_DIR/private/catkey.pem’)dnl define(`confCLIENT_CERT’, `CERT_DIR/certs/cacert.pem’)dnl define(`confCLIENT_KEY’, `CERT_DIR/private/catkey.pem’)dnl TRUST_AUTH_MECH(`LOGIN PLAIN’)dnl define(`confAUTH_MECHANISMS’, `LOGIN PLAIN’)dnl 然後產生 .cf 檔,取代原先的 sendmail.cf,然後重新啟動 sendmail 即可。 二,QPopper QPopper 4 開始支援 pop3s 通訊協定。 設定方式,一般來說,QPopper 都是由 inetd 來呼叫。我們先 設定 inetd.conf,加入 pop3s stream tcp nowait root /usr/local/sbin/popper -d -f /etc/mail/qpopper-tls.config port 995 popper 然後,在 /etc/mail 下放一個 qpopper-tls.conf 檔案(當然, 這個檔可以放在任何地方,只要修改路徑即可)。內容是 set clear-text-password = ssl set tls-version = all set tls-support = alternate-port set tls-server-cert-file = /etc/ssl/private/catreq.pem 如此,即可啟動 QPopper 的 POP3S 支援 -- ※ Origin: 臺大電機 Maxwell 站 ◆ From: gate.sina.com.tw