對這文章發表回應
發表限制: 非會員 可以發表
冷日說在前面:
這篇事實上就是第一篇的重複轉載!
但是因為冷日發現當年轉載的時候居然斷掉了,所以重新轉載一次!
如何製作 SSL X.509 憑證?
目錄
前言
版權所有 © 2002 依瑪貓。依瑪貓保有所有權利。如欲轉載、引用本文 ,請先詳閱 旅舍依瑪版權 聲明。
本文的目的為:在 Linux/*BSD/UNIX 下,用 OpenSSL ,以自己名字發行 X.509 SSL 憑證 (Certificate) 。我們會製作兩個憑證:第一 步先做以自己為名 (XXX Association, YYY Corporation) ,自己簽名背書的 最高層認證中心 (Root CA) ,第二步再做以伺服器為名 (www.abccompany.com) ,用第一步做的最高層認證中心 (XXX Association, YYY Corporation) 簽發的憑證 (Certificate) 。為簡化起見,我們不做中間 的憑證單位,直接由最高層認證中心 (Root CA) ,來簽發憑證。
本文只討論 SSL X.509 憑證做法,不討論系統安全問題,不 討論加解密的演算法,也不討論 OpenSSL 的如何安裝。我假設妳瞭解基本 Public Key/Private Key 不對稱加解密的觀念,知道什麼是 RSA/DSA 演算法 。我也假設妳已經裝好了 OpenSSL ,安裝時使用下列符合 FHS[ 1]標準的設定:
./config --prefix=/usr --openssldir=/usr/share/ssl
或安裝 RPM 或 apt 的 openssl 套件。
本文是做法教學 (HOWTO) ,所以在編排上,把做法步驟 (how) 放在最前面 ,觀念說明和討論 (what and why) 等,都放在文末。若妳看不懂做法,或想 先學一些基本概念,請先往後翻閱,不需由前到後閱讀。
請注意: 依本文製作的憑證,還是會在瀏覽器等 SSL 程 式上出現憑證無效的警告。詳情請參考「 SSL/X.509 簡介」與「 憑證無效的警告」。
按 X.509 的規定,憑證可以用 RSA Key ,也可以用 DSA Key 。不過在 SSL 通訊中,伺服器的憑證因 為要用來傳 Key ,而只有 RSA 可以傳 Key ,所以只能用 RSA 。至於認證中心,只是簽名查核用,不用傳 Key , DSA 或 RSA 都可以,但因為還有一些 SSL 程式不認得 DSA[ 2] ,為相容性起見,這裏我們也做成 RSA 。
要製作最高層認證中心,可以以一般使用者權限來做,不一定要是 root 。但如果做出來的最高層認證中心,是整個組織簽發憑證 要用的,建議以 root 的權限來做,比較安全。同理,製作憑證 ,也可以以一般使用者權限來做。但如果做出來的憑證,是這個伺服器要用的 ,為安全起見,建議以 root 的權限來做。
若妳是 root ,要安裝給整個組織來用:
設定 OpenSSL 的環境
若妳是用上述方法安裝:
./config --prefix=/usr --openssldir=/usr/share/ssl
或裝 Red Hat 的 RPM , OpenSSL 的設定檔目錄會在 /usr/share/ssl 。若妳是安裝 Mandrake 的 RPM,設定檔目錄會在 /usr/lib/ssl 。這兩個位置都不符合 FHS 的要求,資料備份起來也不方便。設定檔應該放在 /etc/ssl 下。若妳是安裝 Debian 的 apt ,設定檔目錄會在 /etc/ssl 下,不會有問題。
# 設定相關的目錄
mkdir -p /etc/ssl
mkdir -p /etc/ssl/private
chmod og-rwx /etc/ssl/private
mkdir -p /etc/ssl/certs
mkdir -p /etc/ssl/crl
mkdir -p /etc/ssl/newcerts
# 設定 OpenSSL 設定檔[3]
mv /usr/share/ssl/openssl.cnf /etc/ssl
ln -s /etc/ssl/openssl.cnf /usr/share/ssl/openssl.cnf
# 設定 OpenSSL 設定檔的位置[4]
export OPENSSL_CONF="/etc/ssl/openssl.cnf"
# 把 OpenSSL 設定檔的位置加進 .bashrc 中[5]
echo "# OpenSSL 設定檔的位置" >> ~/.bashrc
echo "export OPENSSL_CONF=\"/etc/ssl/openssl.cnf\"" >> ~/.bashrc
# 製作亂數檔[6]
openssl rand -out /etc/ssl/private/.rand 1024
chmod og-rwx /etc/ssl/private/.rand
然後修改 /etc/ssl/openssl.cnf ,把這一行
dir = ./demoCA # Where everything is kept
改成這樣
dir = /etc/ssl # Where everything is kept
製作最高層認證中心 (Root CA)
若妳之前做過最高層認證中心,不要重做,不然原來簽發的憑證,都會失效 ,都要重簽。除非最高層認證中心自己過期、檔案遺失、 Private Key 外洩, 否則絕對不要重做最高層認證中心。
假設妳要做的最高層認證中心叫做 myrootca 。
1. 製作 Private Key (及 Public Key )
這裏我們做一支新的 Private Key 。 Public Key 可由 Private Key 推得 ,所以不用特別去做。
請為最高層認證中心的 Private Key 設定一個適當的密碼。
# 製作 RSA[7] Private Key
openssl genrsa -des3 -out /etc/ssl/private/myrootca.key 2048
chmod og-rwx /etc/ssl/private/myrootca.key
2. 填寫憑證申請書
憑證申請書,是把妳的資料,和這個 Public Key 夾在一起,以便認證中心 審核,簽上簽名用的。所以這個步驟,會問妳這個 Key 的相關資料,包括國家 、城市、單位名稱、部門名稱、憑證名稱、聯絡人的信箱,以及申請的效期等 等。請一一填寫。詳情請參考「 什麼是憑證?」。
若妳要直接用最高層認證中心來直接當憑證用,憑證名稱 (Common Name) 請用伺服器的全名 (www.abc.com) 。詳情請參考「 其她 SSL/X.509 憑證的做法」。
若不知如何填寫,請參閱「 如何填寫憑證申請書」。
# 填寫憑證申請書
openssl req -new -key /etc/ssl/private/myrootca.key -out /tmp/myrootca.req
3. 簽發憑證
最高層認證中心因為沒有上級了,沒有人能給它簽名,只能自己給自己簽名 。詳情請參考「 什麼是最高層認證中心?」。
最高層認證中心最好永遠不要過期。要是過期重簽,所有原來它簽發的憑證 也都要重簽,所有 SSL 程式也都要重新設定。所以我們效期簽 7305 天(大約 20年)。若不設效期的話,預設是 30 天(一個月)。
簽完憑證,憑證申請書就不用了,可以刪掉。
# 自己給自己簽名
openssl x509 -req -days 7305 -sha1 \
-extfile /etc/ssl/openssl.cnf -extensions v3_ca \
-signkey /etc/ssl/private/myrootca.key \
-in /tmp/myrootca.req -out /etc/ssl/certs/myrootca.crt
# 刪除憑證申請書
rm -f /tmp/myrootca.req
這樣就好了。 Private Key 在 /etc/ssl/private/ myrootca.key ,自己簽名的 Public Key 憑證在 /etc/ssl/certs/ myrootca.crt。 myrootca.key 是 Private Key ,要小心存好保 護,只有 root 才能讀,權限建議 0444 。 myrootca.crt 是 Public Key 憑證,要儘量散出去 ,讓大家用。最好放到內部網路上,或放到網站上,讓大家自己下載,自己加 進去。
製作伺服器用的憑證
假設妳要做 myhost 的憑證:
1. 製作 Private Key (及 Public Key )
這裏我們做一支新的 Private Key 。 Public Key 可由 Private Key 推得 ,所以不用特別去做。
請先登入到要用憑證的那臺伺服器上。
注意:伺服器的 Private Key 不要設密碼,不然 SSL 伺服器程式啟動的時候,一去讀憑證和 Private Key ,就 要問一次密碼。每次重開機,依序啟動每個伺服器程式的時候,一碰到要讀 Private Key 的伺服器程式,都會停下來等鍵盤輸入密碼。要是放假沒人,或 伺服器放在 IDC 機房,從遠端重開機或 Crash 後自行重開機, 卻當在那裏等鍵盤敲密碼,開不了機,那就不好玩了。
# 製作 RSA Private Key
openssl genrsa -out /etc/ssl/private/myhost.key 2048
chmod og-rwx /etc/ssl/private/myhost.key
2. 填寫憑證申請書
憑證申請書,是把妳的資料,和這個 Public Key 夾在一起,以便認證中心 審核,簽上簽名用的。所以這個步驟,會問妳這個 Key 的相關資料,包括國家 、城市、單位名稱、部門名稱、憑證名稱、聯絡人的信箱,以及申請的效期等 等。這裏憑證名稱 (Common Name) 要用伺服器的全名 (www.abc.com) ,其她 請一一填寫。詳情請參考「 什麼是憑證?」。
若不知如何填寫,請參閱「 如何填寫憑證申請書」。
# 填寫憑證申請書
openssl req -new -key /etc/ssl/private/myhost.key -out /tmp/myhost.req
3. 用最高層認證中心簽發憑證[ 8]
伺服器憑證的效期其實無所謂,過期重簽一張就好了。 SSL程式認的是認證中心,不是憑證,所以憑證簽了就會生效,不用去設定 SSL 程式。不過為免重簽的麻煩,我們效期還是簽 3650 天(大 約十年)。
簽完憑證,憑證申請書就不用了,可以刪掉。
# 簽發憑證
openssl x509 -req -days 3650 -sha1 \
-extfile /etc/ssl/openssl.cnf -extensions v3_req \
-CA /etc/ssl/certs/myrootca.crt -CAkey /etc/ssl/private/myrootca.key \
-CAserial /etc/ssl/myrootca.srl -CAcreateserial \
-in /tmp/myhost.req -out /etc/ssl/certs/myhost.crt
# 刪除憑證申請書
rm -f /tmp/myhost.req
這樣就好了。[ 9]Private Key 在 /etc/ssl/private/ myhost.key , 要小心存好保護,只有 root 才能讀,建議權限為 0400 ; Public Key 憑證在 /etc/ssl/certs/ myhost.crt,要儘量散出去,讓大家用。這組 Public/Private Key 憑證可以做為 myhost 的 SSL 憑證,用在 HTTPS或 POP3S/TLS/SSL 上。最好不要 把檔案搬到別的地方。妳可以在設定檔裏,把憑證位置設定到這裏。 Private Key 不要到處放,以免不小心忘記保護。
若妳是一般使用者:
設定 OpenSSL 的環境
# 設定相關的目錄
mkdir -p ~/etc
mkdir -p ~/etc/ssl
mkdir -p ~/etc/ssl/private
chmod og-rwx ~/etc/ssl/private
mkdir -p ~/etc/ssl/certs
mkdir -p ~/etc/ssl/crl
mkdir -p ~/etc/ssl/newcerts
mkdir -p ~/tmp
# 設定 OpenSSL 設定檔[10]
cp /usr/share/ssl/openssl.cnf ~/etc/ssl
# 設定 OpenSSL 設定檔的位置[11]
export OPENSSL_CONF="$HOME/etc/ssl/openssl.cnf"
# 把 OpenSSL 設定檔的位置加進 .bashrc 中[12]
echo "# OpenSSL 設定檔的位置" >> ~/.bashrc
echo "export OPENSSL_CONF=\"$HOME/etc/ssl/openssl.cnf\"" >> ~/.bashrc
# 製作亂數檔[13]
openssl rand -out ~/etc/ssl/private/.rand 1024
chmod og-rwx ~/etc/ssl/private/.rand
然後修改 ~/etc/ssl/openssl.cnf ,把這一行
dir = ./demoCA # Where everything is kept
改成這樣
dir = ~/etc/ssl # Where everything is kept
製作最高層認證中心 (Root CA)
若妳之前做過最高層認證中心,不要重做,不然原來簽發的憑證,都會失效 ,都要重簽。除非最高層認證中心自己過期、檔案遺失、 Private Key 外洩, 否則絕對不要重做最高層認證中心。
假設妳要做的最高層認證中心叫做 myrootca 。
1. 製作 Private Key (及 Public Key )
這裏我們做一支新的 Private Key 。 Public Key 可由 Private Key 推得 ,所以不用特別去做。
請為最高層認證中心的 Private Key 設定一個適當的密碼。
注意:伺服器的 Private Key 不要設密碼,不然 SSL 伺服器程式啟動的時候,一去讀憑證和 Private Key ,就 要問一次密碼。每次重開機,依序啟動每個伺服器程式的時候,一碰到要讀 Private Key 的伺服器程式,都會停下來等鍵盤輸入密碼。要是放假沒人,或 伺服器放在 IDC 機房,從遠端重開機或 Crash 後自行重開機, 卻當在那裏等鍵盤敲密碼,開不了機,那就不好玩了。
# 製作 RSA[14] Private Key
openssl genrsa -des3 -out ~/etc/ssl/private/myrootca.key 2048
chmod og-rwx ~/etc/ssl/private/myrootca.key
2. 填寫憑證申請書
憑證申請書,是把妳的資料,和這個 Public Key 夾在一起,以便認證中心 審核,簽上簽名用的。所以這個步驟,會問妳這個 Key 的相關資料,包括國家 、城市、單位名稱、部門名稱、憑證名稱、聯絡人的信箱,以及申請的效期等 等。請一一填寫。詳情請參考「 什麼是憑證?」。
若不知如何填寫,請參閱「 如何填寫憑證申請書」。
若妳要直接用最高層認證中心來直接當憑證用,憑證名稱 (Common Name) 請用伺服器的全名 (www.abc.com) 。詳情請參考「 其她 SSL/X.509 憑證的做法」。
# 填寫憑證申請書
openssl req -new -key ~/etc/ssl/private/myrootca.key -out ~/tmp/myrootca.req
3. 簽發憑證
最高層認證中心因為沒有上級了,沒有人能給它簽名,只能自己給自己簽名 。詳情請參考「 什麼是最高層認證中心?」。
最高層認證中心最好永遠不要過期。要是過期重簽,所有原來它簽發的憑證 也都要重簽,所有 SSL 程式也都要重新設定。所以我們效期簽 7305 天(大約 20年)。若不設效期的話,預設是 30 天(一個月)。
簽完憑證,憑證申請書就不用了,可以刪掉。
# 自己給自己簽名
openssl x509 -req -days 7305 -sha1 \
-extfile ~/etc/ssl/openssl.cnf -extensions v3_ca \
-signkey ~/etc/ssl/private/myrootca.key \
-in ~/tmp/myrootca.req -out ~/etc/ssl/certs/myrootca.crt
# 刪除憑證申請書
rm -f ~/tmp/myrootca.req
這樣就好了。 Private Key 在 ~/etc/ssl/private/ myrootca.key ,自己簽名的 Public Key 憑證在 ~/etc/ssl/certs/ myrootca.crt。 myrootca.key 是 Private Key ,要小心存好保 護,只有自己才能讀,權限建議 0400 。 myrootca.crt 是 Public Key 憑證,要儘量散出去 ,讓大家用。最好放到網站上,讓大家自己下載,自己加進去。
製作伺服器用的憑證
假設妳要做 myhost 的憑證:
1. 製作 Private Key (及 Public Key )
這裏我們做一支新的 Private Key 。 Public Key 可由 Private Key 推得 ,所以不用特別去做。
# 製作 RSA Private Key
openssl genrsa -out ~/etc/ssl/private/myhost.key 2048
chmod og-rwx ~/etc/ssl/private/myhost.key
2. 填寫憑證申請書
憑證申請書,是把妳的資料,和這個 Public Key 夾在一起,以便認證中心 審核,簽上簽名用的。所以這個步驟,會問妳這個 Key 的相關資料,包括國家 、城市、單位名稱、部門名稱、憑證名稱、聯絡人的信箱,以及申請的效期等 等。這裏憑證名稱 (Common Name) 要用伺服器的全名 (www.abc.com) ,其她 請一一填寫。詳情請參考「 什麼是憑證?」。
若不知如何填寫,請參閱「 如何填寫憑證申請書」。
# 填寫憑證申請書
openssl req -new -key ~/etc/ssl/private/myhost.key -out /tmp/myhost.req
3. 用最高層認證中心簽發憑證[ 8][ 15]
伺服器憑證的效期其實無所謂,過期重簽一張就好了。 SSL程式認的是認證中心,不是憑證,所以憑證簽了就會生效,不用去設定 SSL 程式。不過為免重簽的麻煩,我們效期還是簽 3650 天(大 約十年)。
簽完憑證,憑證申請書就不用了,可以刪掉。
# 簽發憑證
openssl x509 -req -days 3650 -sha1 \
-extfile ~/etc/ssl/openssl.cnf -extensions v3_req \
-CA ~/etc/ssl/certs/myrootca.crt -CAkey ~/etc/ssl/private/myrootca.key \
-CAserial ~/etc/ssl/myrootca.srl -CAcreateserial \
-in /tmp/myhost.req -out ~/etc/ssl/certs/myhost.crt
# 刪除憑證申請書
rm -f /tmp/myhost.req
這樣就好了。[ 16]Private Key 在 ~/etc/ssl/private/ myhost.key,要小心存好保護,只有自己才能讀,建議權限為 0400 ; Public Key 憑證在 ~/etc/ssl/certs/ myhost.crt ,要儘量散出去 ,讓大家用。這組 Public/Private Key 憑證可以做為 myhost 的 SSL 憑證,用在 HTTPS 或 POP3S/TLS/SSL 上。
設定伺服器
常見的 SSL 通訊方式有兩種:一種是傳統的 SSL ,一種是新的 TLS 。
傳統的 SSL ,一連上伺服器,就進入 SSL , 全程加密。這樣做有一個缺點:為了不讓使用者程式混淆,要把 SSL 開在另外一個 TCP 埠,還要設定使用者的程 式,改連到 SSL 的那個 TCP 埠去。 HTTP 和 HTTPS 的方式就是這樣。
新的 TLS ,則是在使用者程式連上伺服器後,下 STARTTLS 指令,如果伺服器有 SSL ,就會進入 SSL ,雙方開始加密;如果伺服器沒有 SSL ,看 不懂 STARTTLS
,雙方就按原來的方式繼續連線。這樣做的好處 是,使用者程式不用改設連接埠,可以自行切入 SSL 或退回不 加密連線,相容性高,也不用為了 SSL ,多開一個 TCP 埠。但 TLS 的缺點則是,就算憑證查核的結 果有問題,不能做 SSL ,還是可以退回原來的方式繼續連線, 那憑證查核的工作,有做等於沒做。只有連線加密的的優點而已,無法查證伺 服器的身份。
以下依不同的通訊協定,分別討論。
HTTP
HTTP 是最早用 SSL 的通訊協定。 Netscape 當初是為了加密 HTTP ,做安全網路交易,才設計了 SSL ,開一個新的 TCP 埠 443 給它專用,取 名為 HTTPS ,延用至今。因此, HTTP 的 SSL 用的是傳統的方式,沒有 TLS ,要開 HTTPS(443) 。
Apache
Apache 要做 HTTPS ,可以搭配 Apache-SSL ,或搭配 mod_ssl 。請參考各自的設定說明。
要注意的是, 一個 Apache 只能記一組憑證,而憑證上有伺服器 的全名,瀏覽器會用來核對網站站名,所以一個 Apache ,也只能架一個 SSL 站,用一個站名。除非妳跑很多份 Apache ,各自跑在不 同的 IP 或不同的 TCP 埠上,才能在同一臺伺服 器上,跑好幾個 SSL 站。
以 mod_ssl 來說,安裝好後,
httpd.conf 設定舉例如下:
......
## mod_ssl.c: mod_ssl 基本設定
Listen 443
AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl .crl
SSLSessionCache dbm:/var/log/apache/ssl_scache
SSLSessionCacheTimeout 300
SSLPassPhraseDialog builtin
SSLMutex file:/var/log/apache/ssl_mutex
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
SSLLog /var/log/apache/ssl_engine_log
SSLLogLevel info
SSLCipherSuite ALL:!ADH:!EXP56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile /etc/ssl/certs/myhost.crt
SSLCertificateKeyFile /etc/ssl/private/myhost.key
SSLEngine on
......
設好後,檢查看 httpd.conf 有沒有設錯:
httpd -t
要是沒有問題,重開 httpd , SSL 網站就開 跑了。
POP3
POP3 可以跑兩種方式:傳統用 POP3S(995) 埠專跑 SSL ,或是用 TLS ,在原來的 POP3(110) 埠上,加上 STARTTLS 的功能。
POP3 的 TLS 指令是 STLS 。
Qpopper
要安裝 Qpopper ,請參 考 Qpopper 的說明文件。
Qpopper 可以做 POP3S(995) ,也可以在 POP3(110) 上做 TLS 。然而,一個 Qpopper 只 能開一個 TCP 埠,用一種方式跑。如果要同時做 POP3S(995) 和 POP3(110)/TLS , 要跑兩份 Qpopper,各自用不同的設定檔。
設定 /etc/qpopper.conf 如下:
# qpopper.conf: Qpopper POP3(110)/TLS 的設定檔
set clear-text-password = always
set statistics = true
set tls-support = stls
set tls-private-key-file = /etc/ssl/private/myhost.key
set tls-server-cert-file = /etc/ssl/certs/myhost.crt
設定 /etc/qpopper-s.conf 如下:
# qpopper-s.conf: Qpopper POP3S(995) 的設定檔
set clear-text-password = tls
set statistics = true
set tls-support = alternate-port
set tls-private-key-file = /etc/ssl/private/myhost.key
set tls-server-cert-file = /etc/ssl/certs/myhost.crt
然後用 root 的權限,分別執行:
popper -f /etc/qpopper.conf
popper 995 -f /etc/qpopper-s.conf
這樣就可以了。查看:
ps ax | grep popper
妳會看到有兩個 popper ,用不同的參數在跑。查看:
netstat -ap | grep popper
妳會看到兩個 popper ,分別在 POP3(110) 和 POP3S(995) 兩個 TCP 埠上。
SMTP
SMTP 也可以跑兩種方式:舊式的做法,是另開一個 SMTPS(465) 埠,來專跑 SSL 。新的做法則用 TLS ,在原來的 SMTP(25) 埠上,加上 STARTTLS 的功能。 TLS 用同一個連接埠,相容 性比較高,為郵件伺服器間收發信的相容性起見,請儘量採用 TLS 。[ 17]
SMTP 的 TLS 指令是 STARTTLS。
Sendmail
Sendmail 可以在編譯時,加入 SMTPS 和 TLS的支援,不過 SMTPS 是屬於 FFR (for future release) 尚未正式發表的功能,在所有 Sendmail 的說明文件中,都找不到 SMTPS 的說明,只有 TLS 的說明。
Sendmail 送信時,只會在原來的 SMTP(25) 埠上,試 STARTTLS 指令。對方要是不支援 TLS 就算了, 用原來不加密的方法寄信,不會去試對方的 SMTPS(465) 埠。
為讓郵件順利流通,不要掉信, Sendmail 送信時,能加密就加密,不會查 核對方的憑證。更何況,在 TLS 下,查核對方的憑證,也沒什 麼意義。
要設定 Sendmail 使用 SSL ,編譯 Sendmail 時,要在 devtools/Site/site.config.m4 檔,加入下列這幾行:
# STARTTLS - 加入 SSL/TLS 功能
APPENDDEF(`conf_sendmail_ENVDEF', `-DSTARTTLS')
APPENDDEF(`conf_sendmail_LIBS', `-lssl -lcrypto')
# SMTP SSL - 加入 SMTPS 功能
APPENDDEF(`conf_sendmail_ENVDEF', `-D_FFR_SMTP_SSL')
編譯、安裝:
# 編譯 Sendmail
./Build
# 安裝 Sendmail
make install
接下來要設定 Sendmail 的設定檔 /etc/mail/sendmail.cf。如果妳是用 m4 來做設定檔,在 m4 檔 config.mc 中加入下 列幾行:
dnl Sendmail SMTPS/STARTTLS SSL 設定
define(`confCACERT_PATH', `/etc/ssl/certs')
define(`confCACERT', `/etc/ssl/certs/myrootca.crt')
define(`confSERVER_CERT', `/etc/ssl/certs/myhost.crt')
define(`confSERVER_KEY', `/etc/ssl/private/myhost.key')
define(`confCLIENT_CERT', `/etc/ssl/certs/myhost.crt')
define(`confCLIENT_KEY', `/etc/ssl/private/myhost.key')
DAEMON_OPTIONS(`Name=MTA')dnl
DAEMON_OPTIONS(`Port=465, Name=MTASSL, M=s')dnl
重做設定檔:
m4 m4/cf.m4 config.mc > config.cf
cp -f config.cf /etc/mail/sendmail.cf
然後重開 Sendmail 。這樣 Sendmail 就可以開始做 SMTPS/TLS SSL 了。查看:
netstat -ap | grep sendmail
妳會看到同一個 sendmail ,跑在 SMTP(25) 和 SMTPS(465) 兩個[ 18] TCP 埠上。
不過設定還沒結束。
Sendmail 自 8.12.1 版以後,為加強安全性,將伺服器和使用者程式分開 。伺服器程式因為要跑在低於 1024 的 SMTP(25) 埠,還是要由 root 來啟動,以 root 的權限來執行。使用者程 式則不再 setuid root ,改成 setgid smmsp[ 19],用 smmsp 群組的權限執行,再用 SMTP 連線到 伺服器程式發信。
Sendmail 伺服器程式因為有 root 的權限,要讀 Private Key 不是問題。可是, Sendmail 使用者程式現在沒有了 root的權限,發信的時候,就讀不到我們伺服器的 Private Key 了。怎麼辦?
我們不要讓 Sendmail setuid- root ,也不要開放伺服器 Private Key 的權限。我們可以另外做一組只有 smmsp 群組讀 得到的憑證,給 Sendmail 的使用者程式專用:
# 設定目錄
mkdir -p /etc/mail/private
chgrp smmsp /etc/mail/private
chmod o-rwx /etc/mail/private
mkdir -p /etc/mail/certs
# 製作 RSA Private Key
openssl genrsa -out /etc/mail/private/myhost-msp.key 2048
chgrp smmsp /etc/mail/private/myhost-msp.key
chmod o-rwx /etc/mail/private/myhost-msp.key
# 填寫憑證申請書
openssl req -new -key /etc/mail/private/myhost-msp.key \
-out /tmp/myhost-msp.req
# 簽發憑證
openssl x509 -req -days 3650 -sha1 \
-extfile /etc/ssl/openssl.cnf -extensions v3_req \
-CA /etc/ssl/certs/myrootca.crt -CAkey /etc/ssl/private/myrootca.key \
-CAserial /etc/ssl/myrootca.srl -CAcreateserial \
-in /tmp/myhost-msp.req -out /etc/mail/certs/myhost-msp.crt
# 刪除憑證申請書
rm -f /tmp/myhost-msp.req
然後設定 m4 檔 submic.mc 如下:
......
dnl Sendmail STARTTLS SSL/TLS support
define(`confCACERT_PATH', `/etc/ssl/certs')
define(`confCACERT', `/etc/ssl/certs/myrootca.crt')
define(`confCLIENT_CERT', `/etc/mail/certs/myhost-msp.crt')
define(`confCLIENT_KEY', `/etc/mail/private/myhost-msp.key')
define(`confDONT_BLAME_SENDMAIL', `GroupReadableKeyFile')
......
重做設定檔:
m4 m4/cf.m4 submit.mc > submit.cf
cp -f submit.cf /etc/mail/submit.cf
這樣就可以了。這不是設定 Sendmail 伺服器程式,不用重開 Sendmail 。 ^_*' 妳可以寄一封信給自己,然後看看系統郵件記錄 maillog ,有沒有成功 使用 SSL 。
......
Sep 14 04:19:24 rinse sendmail[12093]: STARTTLS=client, relay=localhost.localdom
ain., version=TLSv1/SSLv3, verify=OK, cipher=EDH-RSA-DES-CBC3-SHA, bits=168/168
......
設定作業系統
有些作業系統,設有系統公用的憑證庫,把認得的憑證、認證中心放在一起 。我們把我們自製的認證中心,加進系統公用的憑證庫,使用這個憑證庫的程 式,就可以查得到了。
MS-WINDOWS
MS-WINDOWS 設有共用的憑證庫。從 [控制台] 進去,裏面有 [網際網路選項] (或 [Internet 選項] )。在 上面點兩下,會打開一個 [網際網路 內容] (或 [Internet 內容] )的視窗。在 [內容] 那一頁 裏,中間有一區 [憑證] ,裏面有一個 [憑證(C)...] 的按鈕。按一下那個按鈕,會打開一個視窗,標 題是 [憑證] 。這裏就是 MS-WINDOWS 管理憑證的地方。[ 20]
要加進我們的最高層認證中心,將我們的最高層認證中心 myrootca.crt 複製到 WINDOWS 上。點兩下打開 myrootca.crt ,會跳出一個 [憑證]的視窗,裏面會列出憑證的內容。按下面的 [安裝憑證]按鈕, 會跑出一個 [憑證管理員匯入精靈] 。一直按 [下一步] ,就會加進去了。
我所知道,會使用系統憑證庫的 WINDOWS 程式,有 Internet Exporer 、 Outlook Express 、 Outlook 、 Symantec pcAnywhere 。只要把我們自製的 認證中心加進來,這些程式都可以用得到。
原文出處:SSL X.509 憑證教學