茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1671314 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
HoneyMoon_Day2_00046.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

小企鵝開談 : [分享]SSL X.509 憑證教學

發表者 討論內容
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[分享]SSL X.509 憑證教學

如何製作 SSL X.509 憑證?

前言

版權所有 © 2002-2006 依瑪貓。依瑪貓保有所有權利。如欲轉載、引用本文,請先詳閱 旅舍依瑪版權聲明

本文的目的為:在 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 , DSARSA 都可以,但因為還有一些 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.pem 2048
chmod og-rwx /etc/ssl/private/myrootca.key.pem

2. 填寫憑證申請書

憑證申請書,是把妳的資料,和這個 Public Key 夾在一起,以便認證中心審核,簽上簽名用的。所以這個步驟,會問妳這個 Key 的相關資料,包括國家、城市、單位名稱、部門名稱、憑證名稱、聯絡人的信箱,以及申請的效期等等。請一一填寫。詳情請參考 什麼是憑證?

若妳要直接用最高層認證中心來直接當憑證用,憑證名稱 (Common Name) 請用伺服器的全名 (www.abc.com) 。詳情請參考 其她 SSL/X.509 憑證的做法

若不知如何填寫,請參閱 如何填寫憑證申請書



# 填寫憑證申請書
openssl req -new -key /etc/ssl/private/myrootca.key.pem -out /tmp/myrootca.req.pem

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.pem \
-in /tmp/myrootca.req.pem -out /etc/ssl/certs/myrootca.crt.pem
# 刪除憑證申請書
rm -f /tmp/myrootca.req.pem
# 建立 hash 索引
c_rehash /etc/ssl/certs

這樣就好了。 Private Key 在 /etc/ssl/private/ myrootca.key.pem ,自己簽名的 Public Key 憑證在 /etc/ssl/certs/ myrootca.crt.pem myrootca.key.pem 是 Private Key ,要小心存好保護,只有 root 才能讀,權限建議 0400 。 myrootca.crt.pem 是 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.pem 2048
chmod og-rwx /etc/ssl/private/myhost.key.pem

2. 填寫憑證申請書

憑證申請書,是把妳的資料,和這個 Public Key 夾在一起,以便認證中心審核,簽上簽名用的。所以這個步驟,會問妳這個 Key 的相關資料,包括國家、城市、單位名稱、部門名稱、憑證名稱、聯絡人的信箱,以及申請的效期等等。這裏憑證名稱 (Common Name) 要用伺服器的全名 (www.abc.com) ,其她請一一填寫。詳情請參考 什麼是憑證?

若不知如何填寫,請參閱 如何填寫憑證申請書



# 填寫憑證申請書
openssl req -new -key /etc/ssl/private/myhost.key.pem -out /tmp/myhost.req.pem

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.pem -CAkey /etc/ssl/private/myrootca.key.pem \
-CAserial /etc/ssl/myrootca.srl -CAcreateserial \
-in /tmp/myhost.req.pem -out /etc/ssl/certs/myhost.crt.pem
# 刪除憑證申請書
rm -f /tmp/myhost.req.pem

這樣就好了。[ 9] Private Key 在 /etc/ssl/private/ myhost.key.pem ,要小心存好保護,只有 root 才能讀,建議權限為 0400 ; Public Key 憑證在 /etc/ssl/certs/ myhost.crt.pem ,要儘量散出去,讓大家用。這組 Public/Private Key 憑證可以做為 myhostSSL 憑證,用在 HTTPSPOP3/ TLSSMTPS/ TLS …等等各種 SSL 連線上。最好不要把檔案搬到別的地方。妳可以在設定檔裏,把憑證位置設定到這裏。 PrivateKey 不要到處放,以免不小心忘記保護。

若妳是一般使用者:

設定 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 設定一個適當的密碼。



# 製作 RSA[14] Private Key
openssl genrsa -des3 -out ~/etc/ssl/private/myrootca.key.pem 2048
chmod og-rwx ~/etc/ssl/private/myrootca.key.pem

2. 填寫憑證申請書

憑證申請書,是把妳的資料,和這個 Public Key 夾在一起,以便認證中心審核,簽上簽名用的。所以這個步驟,會問妳這個 Key 的相關資料,包括國家、城市、單位名稱、部門名稱、憑證名稱、聯絡人的信箱,以及申請的效期等等。請一一填寫。詳情請參考 什麼是憑證?

若不知如何填寫,請參閱 如何填寫憑證申請書

若妳要直接用最高層認證中心來直接當憑證用,憑證名稱 (Common Name) 請用伺服器的全名 (www.abc.com) 。詳情請參考 其她 SSL/X.509 憑證的做法



# 填寫憑證申請書
openssl req -new -key ~/etc/ssl/private/myrootca.key.pem -out ~/tmp/myrootca.req.pem

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.pem \
-in ~/tmp/myrootca.req.pem -out ~/etc/ssl/certs/myrootca.crt.pem
# 刪除憑證申請書
rm -f ~/tmp/myrootca.req.pem
# 建立 hash 索引
c_rehash ~/etc/ssl/certs

這樣就好了。 Private Key 在 ~/etc/ssl/private/ myrootca.key.pem ,自己簽名的 Public Key 憑證在 ~/etc/ssl/certs/ myrootca.crt.pem myrootca.key.pem 是 Private Key ,要小心存好保護,只有自己才能讀,權限建議 0400 。 myrootca.crt.pem 是 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.pem 2048
chmod og-rwx ~/etc/ssl/private/myhost.key.pem

2. 填寫憑證申請書

憑證申請書,是把妳的資料,和這個 Public Key 夾在一起,以便認證中心審核,簽上簽名用的。所以這個步驟,會問妳這個 Key 的相關資料,包括國家、城市、單位名稱、部門名稱、憑證名稱、聯絡人的信箱,以及申請的效期等等。這裏憑證名稱 (Common Name) 要用伺服器的全名 (www.abc.com) ,其她請一一填寫。詳情請參考 什麼是憑證?

若不知如何填寫,請參閱 如何填寫憑證申請書



# 填寫憑證申請書
openssl req -new -key ~/etc/ssl/private/myhost.key.pem -out /tmp/myhost.req.pem

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.pem -CAkey ~/etc/ssl/private/myrootca.key.pem \
-CAserial ~/etc/ssl/myrootca.srl -CAcreateserial \
-in /tmp/myhost.req.pem -out ~/etc/ssl/certs/myhost.crt.pem
# 刪除憑證申請書
rm -f /tmp/myhost.req.pem

這樣就好了。[ 16] Private Key 在 ~/etc/ssl/private/ myhost.key.pem ,要小心存好保護,只有自己才能讀,建議權限為 0400 ; Public Key 憑證在 ~/etc/ssl/certs/ myhost.crt.pem ,要儘量散出去,讓大家用。這組 Public/Private Key 憑證可以做為 myhostSSL 憑證,用在 HTTPSPOP3S/ TLSSMTPS/ TLS …等等各種 SSL 連線上。最好不要把檔案搬到別的地方。妳可以在設定檔裏,把憑證位置設定到這裏。 PrivateKey 不要到處放,以免不小心忘記保護。

設定作業系統

很多作業系統,都有系統公用的憑證庫,把認得的憑證、認證中心放在一起。我們把我們自製的認證中心,加進系統公用的憑證庫,使用這個憑證庫的程式,就可以查得到了。

Linux/*BSD/UNIX

MS-WINDOWS

MS-WINDOWS 設有共用的憑證庫。從 [控制台] 進去,裏面有 [網際網路選項] (或 [Internet 選項] )。在上面點兩下,會打開一個 [網際網路 內容] (或 [Internet 內容] )的視窗。在 [內容] 那一頁裏,中間有一區 [憑證] ,裏面有一個 [憑證(C)...] 的按鈕。按一下那個按鈕,會打開一個視窗,標題是 [憑證] 。這裏就是 MS-WINDOWS 管理憑證的地方。[ 20]


要加進我們的最高層認證中心,將我們的最高層認證中心 myrootca.crt.pem 複製到 WINDOWS 上。點兩下打開 myrootca.crt.pem ,會跳出一個 [憑證] 的視窗,裏面會列出憑證的內容。按下面的 [安裝憑證]按鈕,會跑出一個 [憑證管理員匯入精靈] 。一直按 [下一步] ,就會加進去了。

我所知道,會使用系統憑證庫的 WINDOWS 程式,有 Internet Exporer 、 Outlook Express 、 Outlook 、 Symantec pcAnywhere 。只要把我們自製的認證中心加進來,這些程式都可以用得到。

設定伺服器

常見的 SSL 通訊方式有兩種:一種是傳統的 SSL ,一種是新的 TLS

傳統的 SSL ,一連上伺服器,就進入 SSL ,全程加密。這樣做有一個缺點:為了不讓使用者程式混淆,要把 SSL 開在另外一個 TCP 埠,還要設定使用者的程式,改連到 SSL 的那個 TCP 埠去。 HTTPHTTPS 的方式就是這樣。

新的 TLS ,則是在使用者程式連上伺服器後,下 STARTTLS 指令,如果伺服器有 SSL ,就會進入 SSL ,雙方開始加密;如果伺服器沒有 SSL ,看不懂 STARTTLS ,雙方就按原來的方式繼續連線。這樣做的好處是,使用者程式不用改設連接埠,可以自行切入 SSL 或退回不加密連線,相容性高,也不用為了 SSL ,多開一個
TCP 埠。但 TLS 的缺點則是,就算憑證查核的結果有問題,不能做 SSL ,還是可以退回原來的方式繼續連線,那憑證查核的工作,有做等於沒做。只有連線加密的的優點而已,無法查證伺服器的身份。

以下依不同的通訊協定,分別討論。

HTTP

HTTP 是最早用 SSL 的通訊協定。 Netscape 當初是為了加密 HTTP ,做安全網路交易,才設計了 SSL ,開一個新的 TCP 埠 443 給它專用,取名為 HTTPS ,延用至今。因此, HTTPSSL 用的是傳統的方式,沒有 TLS ,要開 HTTPS(443) 。

Apache

Apache 要做 HTTPS ,可以搭配 Apache-SSL,或搭配 mod_ssl。請參考各自的設定說明。

注意: Apache 的記憶體中只能存一組憑證。而憑證上記有伺服器的全名,瀏覽器會用來核對網站站名,所以一個 Apache ,只能用一個 SSL 站名。也就是說,一個 Apache ,只能架一個 SSL 站。除非妳跑很多份 Apache ,各自跑在不同的 IP 或不同的 TCP 埠上,才能在同一臺伺服器上,跑好幾個 SSL 站。

以 mod_ssl 來說,安裝好後, httpd.conf
設定舉例如下:



......
## mod_ssl.c: mod_ssl 基本設定
<IfModule mod_ssl.c>
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.pem
SSLCertificateKeyFile /etc/ssl/private/myhost.key.pem
<VirtualHost *:443>
SSLEngine on
</VirtualHost>
</IfModule>
......

設好後,檢查看 httpd.conf 有沒有設錯:



httpd -t

要是沒有問題,重開 httpdSSL 網站就開跑了。

POP3

POP3 可以跑兩種方式:傳統用 POP3(995) 埠專跑 SSL ,或是用 TLS ,在原來的 POP3(110) 埠上,加上 STARTTLS 的功能。

POP3 的 STARTTLS 指令是 STLS

Qpopper

要安裝 Qpopper,請參考 Qpopper 的說明文件。

Qpopper 可以做 POP3(995) ,也可以在 POP3(110) 上做 TLS 。然而,一個 Qpopper 只能開一個 TCP 埠,用一種方式跑。如果要同時做 POP3(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.pem
set tls-server-cert-file = /etc/ssl/certs/myhost.crt.pem

設定 /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.pem
set tls-server-cert-file = /etc/ssl/certs/myhost.crt.pem

然後用 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) 和 POP3(995) 兩個 TCP 埠上。

SMTP

SMTP 也可以跑兩種方式:舊式的做法,是另開一個 SMTPS(465) 埠,來專跑 SSL 。新的做法則用 TLS ,在原來的 SMTP(25) 埠上,加上 STARTTLS 的功能。 TLS 用同一個連接埠,相容性比較高,為郵件伺服器間收發信的相容性起見,請儘量採用 TLS[ 17]

SMTP 的 STARTTLS 指令是 STARTTLS

Sendmail

Sendmail 可以在編譯時,加入 SMTPSTLS 的支援,不過 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.pem')
define(`confSERVER_CERT', `/etc/ssl/certs/myhost.crt.pem')
define(`confSERVER_KEY', `/etc/ssl/private/myhost.key.pem')
define(`confCLIENT_CERT', `/etc/ssl/certs/myhost.crt.pem')
define(`confCLIENT_KEY', `/etc/ssl/private/myhost.key.pem')
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 來啟動伺服器程式,就可以了。使用者程式則不需要 root 的權限,只要可以在專用的郵件佇列目錄存檔就夠了。所以, Sendmail 不再 setuid root ,改成 setgid smmsp[ 19] 。使用者程式要發信的時候,再連到 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.pem 2048
chgrp smmsp /etc/mail/private/myhost-msp.key.pem
chmod o-rwx /etc/mail/private/myhost-msp.key.pem
# 填寫憑證申請書
openssl req -new -key /etc/mail/private/myhost-msp.key.pem \
-out /tmp/myhost-msp.req.pem
# 簽發憑證
openssl x509 -req -days 3650 -sha1 \
-extfile /etc/ssl/openssl.cnf -extensions v3_req \
-CA /etc/ssl/certs/myrootca.crt.pem -CAkey /etc/ssl/private/myrootca.key.pem \
-CAserial /etc/ssl/myrootca.srl -CAcreateserial \
-in /tmp/myhost-msp.req.pem -out /etc/mail/certs/myhost-msp.crt.pem
# 刪除憑證申請書
rm -f /tmp/myhost-msp.req.pem

然後設定 m4 檔 submic.mc 如下:



......
dnl Sendmail STARTTLS SSL/TLS support
define(`confCACERT_PATH', `/etc/ssl/certs')
define(`confCACERT', `/etc/ssl/certs/myrootca.crt.pem')
define(`confCLIENT_CERT', `/etc/mail/certs/myhost-msp.crt.pem')
define(`confCLIENT_KEY', `/etc/mail/private/myhost-msp.key.pem')
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
......

設定瀏覽器

Mozilla 與 Netscape 6 以後的版本

Mozilla 與 Netscape 6 以後的版本,有一個瀏覽器和郵件程式共用的憑證庫。從工具列上的 [編輯(E)][個人功能設定(E)] 進去後,會跳出 [功能設定] 的視窗。展開視窗左邊的 [個人及安全設定] ,點選裏面的 [認證] ,右邊的標題會切換成 [認證] ,中間會有一個 [管理認證...] 的按鈕。按下按鈕,會再跳出一個 [認證管理員] 的視窗。這裏就是 Mozilla 與 Netscape 管理憑證的地方。[ 21][ 22]

要加進我們的最高層認證中心,將我們的最高層認證中心 myrootca.crt.pem 放到網站上,用 Mozilla/Netscape 從 web 連到該網址後,會出現一個 [下載認證中] 的視窗。在 [信認此認證以識別網站][信認此認證以識別郵件用戶][信認此認證以識別軟體製造商] 三個選項上都打勾,然後按 [確定] ,就會加進去了。

如果妳用的是 MS-WINDOWS 下的 Mozilla/Netscape ,妳也可以把最高層認證中心複製到 WINDOWS 上,網址列直接打上檔案路徑,也可以把它加進去。

在 Mozilla/Netscape 瀏覽器加進來的認證中心,也會用在 Mozilla 信件或 Netscape Mail & Newsgroups 裏,來查核憑證。

Internet Explorer

Internet Explorer 使用 WINDOWS 系統的憑證庫,妳只要把認證中心加進系統的憑證庫就可以了。詳情請參考
設定 MS-WINDOWS

Opera

Opera 截至目前為止 (6.05) ,只支援 RSA ,不支援 DSA 。因此,只能匯入 RSA 認證中心,不能匯入 DSA 認證中心。

打開 Opera ,從工具列上的 [檔案(F)][功能設定(R)...] 進去後,會打開 [功能設定] 的視窗。在視窗左邊的選單中,選最下面的 [安全性] 時,右上角會出現 [認證機構(A)...] 的按鈕。按下按鈕,會再打開 [認證機構] 的視窗。按一下右上角的 [匯入(I)...] 按鈕,找到我們的最高層認證中心,在上面點兩下,就會加進去了。

Lynx

Lynx 截至目前為止 (2.8.4) ,不會檢查伺服器的 SSL 憑證。

設定電子郵件程式

Mozilla 與 Netscape 6 以後的版本

要設定使用 SSL 收信,啟動 Mozilla 信件與 News 或 Netscape Mail & Newsgroups 後,由工具列上的 [編輯(E)][信件與 News 帳號設定(M)...] 按下去,會打開一個 [信件與 News 帳號設定] 的視窗。在左邊選擇妳要設定的帳號下的 [伺服器設定] 。視窗右邊的 [伺服器名稱:] 中,要填上 POP3 郵件伺服器的完整名稱。在右下方 [伺服器設定] 裏的 [使用 SSL 安全連線] 選項上打勾,然後按 [確定] 。這樣就會用
SSL 收信了。

要設定使用 SSL 寄信,啟動 Mozilla 信件與 News 或 Netscape Mail & Newsgroups 後,由工具列上的 [編輯(E)][信件與 News 帳號設定(M)...] 按下去,會打開一個 [信件與 News 帳號設定] 的視窗。在左邊選擇 [SMTP 外寄郵件伺服器] ,右邊標題會變成 [SMTP 外送郵件伺服器設定] 。視窗右邊的 [伺服器名稱:] 中,要填上 SMTP 郵件伺服器的完整名稱。右邊中間有一個 [使用 SSL 安全連線] ,選 [若可以時] 。然後按 [確定] 。這樣就會用 SSL 寄信了。

憑證查核的部份,Mozilla 信件與 News 或 Netscape Mail & Newsgroups 使用 Mozilla 或 Netscape 6 的憑證庫,妳只要把認證中心加進 Mozilla 或 Netscape 6 就可以了。詳情請參考 Mozilla 與 Netscape 6 的設定。

Netscape 4 及更早的版本

Netscape 4 及更早的版本不支援 SSL

Outlook Express 6

要設定使用 SSL 收信,啟動 Outlook Express 後,由工具列上的 [工具(T)][帳戶(A)...] 按下去,會打開一個 [網際網路帳戶] 的視窗。在視窗左邊選擇要設定的帳號,然後按下右邊的 [內容(P)] 按鈕,會打開另一個 [某某某 內容] 的視窗。按一下上方的 [伺服器] ,翻到 [伺服器]
那一頁。在 [內送郵件 - POP3(I):] 中,要填上 POP3 郵件伺服器的完整名稱。再按一下上方的 [進階] ,翻到 [進階] 那一頁。在 [內送郵件 - POP3(I):] 下面的 [這個伺服器需要安全連線 - SSL(C)] 的選項上打勾。然後按 [確定][關閉] 。這樣就會用 SSL 收信了。

要設定使用 SSL 寄信,啟動 Outlook Express 後,由工具列上的 [工具(T)][帳戶(A)...] 按下去,會打開一個 [網際網路帳戶] 的視窗。在視窗左邊選擇要設定的帳號,然後按下右邊的 [內容(P)] 按鈕,會打開另一個 [某某某 內容] 的視窗。按一下上方的 [伺服器] ,翻到 [伺服器] 那一頁。在 [外寄郵件 - SMTP(U):] 中,要填上 SMTP 郵件伺服器的完整名稱。再按一下上方的 [進階] ,翻到 [進階] 那一頁。在 [外寄郵件 - SMTP(O):] 下面的 [這個伺服器需要安全連線 - SSL(Q)] 的選項上打勾,並把上面 [外寄郵件 - SMTP(O):] 的連接埠號碼改為 465 。然後按 [確定][關閉] 。這樣就會用 SSL 寄信了。

憑證查核的部份, Outlook Express 6 使用 WINDOWS 系統的憑證庫,妳只要把認證中心加進系統的憑證庫就可以了。詳情請參考 設定 MS-WINDOWS


Outlook Express 5.5

要設定使用 SSL 收信,啟動 Outlook Express 後,由工具列上的 [工具(T)][帳號(A)...] 按下去,會打開一個 [Internet 帳號] 的視窗。在視窗左邊選擇要設定的帳號,然後按下右邊的 [內容(P)] 按鈕,會打開另一個 [某某某 內容] 的視窗。按一下上方的 [伺服器] ,翻到 [伺服器] 那一頁。在 [內送郵件 - POP3(I):] 中,要填上 POP3 郵件伺服器的完整名稱。再按一下上方的 [進階] ,翻到 [進階] 那一頁。在 [內送郵件 - POP3(I):] 下面的 [這個伺服器需要安全連線 - SSL(C)] 的選項上打勾。然後按 [確定][關閉] 。這樣就會用 SSL 收信了。

要設定使用 SSL 寄信,啟動 Outlook Express 後,由工具列上的 [工具(T)][帳號(A)...] 按下去,會打開一個 [Internet 帳號] 的視窗。在視窗左邊選擇要設定的帳號,然後按下右邊的 [內容(P)] 按鈕,會打開另一個 [某某某 內容] 的視窗。按一下上方的 [伺服器] ,翻到 [伺服器] 那一頁。在 [外寄郵件 - SMTP(U):] 中,要填上 SMTP 郵件伺服器的完整名稱。再按一下上方的 [進階] ,翻到 [進階] 那一頁。在 [外寄郵件 - SMTP(O):]
下面的 [這個伺服器需要安全連線 - SSL(Q)] 的選項上打勾,並把上面 [外寄郵件 - SMTP(O):] 的連接埠號碼改為 465 。然後按 [確定][關閉] 。這樣就會用 SSL 寄信了。

憑證查核的部份, Outlook Express 5.5 使用 WINDOWS 系統的憑證庫,妳只要把認證中心加進系統的憑證庫就可以了。詳情請參考 設定 MS-WINDOWS

Outlook Express 4 或 5

要設定使用 SSL 收信,啟動 Outlook Express 後,由工具列上的 [工具(T)][帳號(A)...] 按下去,會打開一個 [Internet 帳號] 的視窗。在視窗左邊選擇要設定的帳號,然後按下右邊的 [內容(P)] 按鈕,會打開另一個 [某某某 內容] 的視窗。按一下上方的 [伺服器] ,翻到 [伺服器] 那一頁。在 [內送郵件 - POP3(I):] 中,要填上 POP3 郵件伺服器的完整名稱。再按一下上方的 [進階] ,翻到 [進階] 那一頁。在 [內送郵件 - POP3(I):] 下面的 [這個伺服器需要安全連線 - SSL(C)] 的選項上打勾。然後按 [確定][結束] 。這樣就會用 SSL 收信了。

要設定使用 SSL 寄信,啟動 Outlook Express 後,由工具列上的 [工具(T)][帳號(A)...] 按下去,會打開一個 [Internet 帳號]
的視窗。在視窗左邊選擇要設定的帳號,然後按下右邊的 [內容(P)] 按鈕,會打開另一個 [某某某 內容] 的視窗。按一下上方的 [伺服器] ,翻到 [伺服器] 那一頁。在 [外寄郵件 - SMTP(U):] 中,要填上 SMTP 郵件伺服器的完整名稱。再按一下上方的 [進階] ,翻到 [進階] 那一頁。在 [外寄郵件 - SMTP(O):] 下面的 [這個伺服器需要安全連線 - SSL(Q)] 的選項上打勾,並把上面 [外寄郵件 - SMTP(O):] 的連接埠號碼改為 465 。然後按 [確定][關閉] 。這樣就會用 SSL 寄信了。

Outlook Express 4 與 5 不會檢查伺服器的 SSL 憑證。

Eudora 5.1 以後的版本

Eudora 的 SSL 設計不是很好。

Eudora 5.1 以後有一個 [Certificate Infomation Manager] 憑證管理員,可以管理 Eudora 的憑證。可是很奇怪,沒有辦法直接進入 [Certificate Infomation Manager][ 23] ,要先用 SSL 收一次信,才能進入 [Certificate Infomation Manager][ 24]

收信時, Eudora 會先用 STARTTLS 指令試探郵件伺服器。成功的話,雙方就進入 SSL 加密連線,開始收信;否則,就繼續用不加密的方式收信。不用特別設定
SSL 收信的方式。不過 Eudora 的 STARTTLS 做法很奇怪:如果 STARTTLS 成功,進入 SSL 以後, Eudora 卻查核不到對方的憑證, Eudora 會立即停止收信,不會重做非 SSL 連線,不會詢問使用者,只會在下面不明顯的地方出現一個小小的警告。對使用自製的伺服器憑證,新加上 STARTTLS 功能的郵件伺服器來說,使用者的 Eudora 原本正常收的信,會不聞不問開始停止收信,給使用者帶來很大的困擾。這是 Eudora 另一個不良的設計。在 TLS 下查核憑證,本來就沒什麼意義。而且憑證查核失敗的原因,只是 Eudora 認不得核發單位,不是憑證真的有問題。Eudora 應該詢問使用者,不應該直接停止收信。

注意: OpenSSL 預設是做 PEM 格式的憑證,所以先前我們做的都是 PEM 格式的憑證。但 Eudora 只能匯入 DER 憑證格式。 PEM 只是把 DER 用 Base64 編碼,以便和傳統七位元的網路標準相容,放在網頁上、用 E-mail 寄或貼在文字檔中。我們可以用 OpenSSL 把 PEMDER



# 將最高層認證中心轉成 DER
openssl x509 -in myrootca.crt.pem -outform der -out myrootca.crt.der

要設定使用 SSL 收信,啟動 Eudora 後,由工具列上的 [Tools][Options...] 按下去,會打開一個 [Options] 的視窗。在左邊的 [Category] 中選擇 [Checking Mail] 。視窗右邊的 [Mail Server:] 中,要填上 POP3 郵件伺服器的完整名稱。右下方有一個 [Secure Sockets when Receiving:] 的選單,選 [If available, STARTTLS] 後,按 [OK] 。這樣就會用 SSL 收信了。

要設定使用 SSL 寄信,啟動 Eudora 後,由工具列上的 [Tools][Options...] 按下去,會打開一個 [Options] 的視窗。在左邊的 [Category] 中選擇 [Sending Mail] 。視窗右邊的 [Mail Server:] 中,要填上 SMTP 郵件伺服器的完整名稱。右下方有一個 [Secure Sockets when Receiving:] 的選單,選 [If available, STARTTLS] 後,按 [OK] 。這樣就會用 SSL 寄信了。

要加入我們的認證中心,要先收一次信。視窗下面會顯示 [SSL Negotiation Failed: Certificate Error: Cert Chain not trusted. ...] 的錯誤訊息。依前述方式回到 [Tools][Options...]
[Category][Checking Mail][Secure Sockets when Receiving:] 後,按一下 [Last SSL Info] ,以開啟 [Eudora SSL Connection Infomation Manager] 的視窗,顯示剛剛收到的憑證內容。按一下下面的 [Certificate Infomation Manager] 按鈕,會再跳出一個 [Certificate Infomation Manager] 的視窗。按一下右下角的 [Import Certificate] ,找到我們的最高層認證中心的 DER myrootca.crt.der ,在上面點兩下,就會加進去了。[ 25]

Becky!

Becky! 的作者 Tomohiro Norimatsu 已經說過,因為 SSL 專利權的問題, Becky! 不會支援 SSL[ 26] 不過我們可以用 SSL 包裝程式,讓 Becky! 透過 SSL 連線來收發信。詳情請參考 設定其她不支援 SSL/ TLS 的程式

Opera 郵件

要設定使用 SSL 收信,打開 Opera ,從工具列上的 [檔案(F)][功能設定(R)...] 進去後,會打開 [功能設定] 的視窗。在視窗左邊的選單中,選 [電子郵件] 時,右邊會出現 [使用 Opera 的帳號(O)] 的選單。選擇要設定的帳號,然後按旁邊的
[更改(P)...] ,會跳出一個 [郵件帳號設定] 的視窗。在上面的 [伺服器] 上按一下,切換到 [伺服器] 那一頁。在 [內收郵件] 裏 , [主機位置(E)] 中,要填上 POP3 郵件伺服器的完整名稱,然後在下面 [協定(R)] 旁邊 [採用 TLS 安全性協定] 的地方打勾,按 [確定][確定] 。這樣就會用 SSL 收信了。

要設定使用 SSL 寄信,打開 Opera ,從工具列上的 [檔案(F)][功能設定(R)...] 進去後,會打開 [功能設定] 的視窗。在視窗左邊的選單中,選 [電子郵件] 時,右邊會出現 [使用 Opera 的帳號(O)] 的選單。選擇要設定的帳號,然後按旁邊的 [更改(P)...] ,會跳出一個 [郵件帳號設定] 的視窗。在上面的 [伺服器] 上按一下,切換到 [伺服器] 那一頁。在 [外寄郵件] 裏 , [主機位置(V)] 中,要填上 SMTP 郵件伺服器的完整名稱,然後在下面 [協定(C)] 旁邊 [採用 TLS 安全性協定] 的地方打勾,按 [確定][確定] 。這樣就會用 SSL 收信了。

憑證查核的部份, Opera 郵件使用 Opera 的憑證庫,妳只要把認證中心加進 Opera 就可以了。詳情請參考 Opera 的設定。

設定其她不支援 SSL/
TLS 的程式

我的程式不支援 SSL/ TLS ,怎麼辦?

沒有關係。我們可以用 SSL 包裝程式,先和伺服器建立 SSL 連線,再將程式送的指令,透過這個 SSL 連線轉送給伺服器,並將伺服器在 SSL 連線中的回應,轉送回來。這樣一來,即使程式本身不懂 SSL ,也可以透過這個 SSL 連線,來加密收送的資料。以下,我們介紹 SSL 包裝程式。

Stunnel

Stunnel 的網站在 http://www.stunnel.org/ ,可以從網站上下載。在 WINDOWS 下,是很簡單好用的 SSL 包裝程式。 WINDOWS 下的簡易使用方式說明如下:

  • 從網站 http://www.stunnel.org/ 上下載 stunnel-x.xx.exelibssl32.dlllibeay32.dll
  • libssl32.dlllibeay32.dll 存到 C:\WINDOWS\SYSTEM (WINDOWS 98/ME) 或 C:\WINNT\SYSTEM32 (WINDOWS NT/2000/XP) 下。
  • C:\Program Files 下新增一個 Stunnel 目錄,把剛剛下載的 stunnel-x.xx.exe 存進這裏。

  • C:\Program Files\Stunnel 中新增一個檔案 stunnel.conf ,內容舉例如下:


    client = yes
    [pop3s]
    accept = localhost:50110
    connect = my.mail.server:995
    [smtps]
    accept = localhost:50025
    connect = my.mail.server:465

  • 啟動 C:\Program Files\Stunnel\stunnel-x.xx.exe 。它會縮到桌面下方工具列的最右邊,變成一個小圖示。這時如果開啟 [MS-DOS 模式][命令提示字元] ,打:


    netstat -an

    會看到類似:


    TCP 127.0.0.1:50025 0.0.0.0:0 LISTENING
    TCP 127.0.0.1:50110 0.0.0.0:0 LISTENING

    的兩行。點兩下 Stunnel 在工具列右邊的小圖示,會顯示 Stunnel 的使用記錄。
  • 啟動程式,修改程式的設定,將原來 SMTP 連到 my.mail.server 連接埠 25 的地方,改連到 localhost 連接埠 50025 ;原來 POP3 連到 my.mail.server 連接埠 110 的地方,改連到 localhost 連接埠 50110 。
  • 收、發信。

這樣應該就可以了,原本不會 SSL 的程式,現在可以透過 Stunnel 使用 SSL 連線了。

這只是 Stunnel 的基本功能。 Stunnel 還有很多強大的功能,不但可以轉送 POP3SMTPIMAPNNTPLDAP … 等各種通訊協定,也可以將 SSL 連線,轉送給不會 SSL 的伺服器程式。這樣即使反過來,伺服器程式本身不會 SSL ,使用者也可以使用 SSL 加密連線。詳細的做法,請下載 Stunnel 的原始程式碼,參照內附的完整操作說明。

不過 Stunnel 有一個很大的限制:因為 Stunnel 只負責先建立好 SSL 連線,並不瞭解通訊協定本身的指令語法,所以無法用 STARTTLS 指令建立 TLS 連線,只能用傳統的方式,一開始就建立全程的 SSL 連線。

觀念討論

SSL/X.509 簡介


X.509 的金字塔制度
X.509 的金字塔制度

SSL 採用的是 X.509 ,由上而下金字塔式的憑證制度。

在 X.509 中,每一個合格的憑證上,都會有一個簽名。最下層的憑證上,會有一個認證中心 ( CA) 的簽名,表示這個認證中心 ( CA) 檢查過,確認所有者資料無誤。中間的認證中心 ( CA) 上,也會有管轄它的最高層認證中心 (Root CA) 的簽名,表示最高層認證中心授權給它,可以簽發別人的憑證。只有最高層認證中心上,因為它已經是最大,沒有再上層可以給它簽名了,所以只好自己簽自己,憑證上的簽名是自己簽的。

程式自己會認得幾家可靠的認證中心 ( CA) ,碰到 SSL 網站時,雖然不認得伺服器的憑證 (Certificate) ,但只要那個憑證上,有自己認得的認證中心 ( CA) 簽名保證過,那個憑證就沒有問題。

當程式碰到合格的 SSL 憑證
當程式碰到合格的 SSL 憑證

但如果那個伺服器憑證上,沒有自己認得的認證中心 ( CA) 簽名保證過,伺服器憑證就有可能有問題,會出現憑證無效的警告。


當程式碰到有問題的 SSL 憑證
當程式碰到有問題的 SSL 憑證

憑證無效的警告

本文第一步討論的是如何自製最高層認證中心 (Root CA) 。因為這是我們自己的認證中心,程式不認得,所以第二步簽發的憑證(Certificate) 上的簽名,程式自然也不認得,一定會出現憑證無效的警告。

當程式碰到我們自製的認證中心
當程式碰到我們自製的認證中心

若不想看到這個警告,就要先讓程式認得我們自己的認證中心 ( CA) 。這時,第二步簽發的憑證 (Certificate) ,程式認得上面認證中心 ( CA) 的簽名,就不會再出現憑證無效的警告。

把我們自己的認證中心加上去
把我們自己的認證中心加上去

詳細做法,請參考 設定作業系統 設定瀏覽器 設定電子郵件程式各節。

注意:這個方法,因為要在程式上,手動加入自己的認證中心 (
CA) ,所以只有自己內部用的網站,使用者和程式數目都有限,可以自己一個一個去設認證中心 ( CA) 的情況下,方才可行。若要用在公開的網站上,因為上網者來自各個不同的地方,妳也都不認識,沒有辦法在她們的電腦上,都加進自己的認證中心,就沒有辦法了。這一點受限於 X.509 的規定,愛莫能助。若真的很在意 SSL 憑證無效警告的問題,又需要在公開的網站使用 SSL ,請向各家簽證公司申請,年費大概幾萬元臺幣。

資料?什麼資料?

等等,剛剛圖中的最後一個步驟,『沒問題,這是給妳的資料』。使用者還沒有填什麼資料啊!程式怎麼可以自己亂給對方資料呢?到底給了什麼資料?程式會不會自己給對方 E-mail 、信用卡號碼、身份證字號、密碼?

程式傳給對方的,是接下來通信時,對稱式加解密用的 Key 。

Public/Private Key 的不對稱加解密法 (Asymmetric Encryption) ,可以把 Public Key 告訴全世界, Private Key 自己秘密保管好,要傳資料給妳的話,只要用妳的 Public Key 加密,全世界就只有妳的 Private Key 才解得開。這種不對稱加解密法雖然很安全,但是加解密的速度很慢。反過來說,傳統的對稱式加解密法 (Symmetric Encryption) ,雖然加解密速度快多了,但是雙方都要握有同一個 Key ,把 Key 傳給對方途中,會有被攔截監聽的危險。

SSL 採用兩階段式的作法:第一階段,先用 Public/Private Key 不對稱加解密法,傳給對方 接下來傳真正資料時,對稱式加解密法要用的 Key。第二階段,再用這個對稱式加解密的 Key ,來傳原本要傳的資料。真正傳資料時用的,其實是對稱式加解密法。這個傳資料用的對稱 Key 是用亂數取的,再用 Public/Private Key 法傳給對方,每一次連線時都不一樣。用這種兩階段式的作法, Key 是用不對稱加解密法傳給對方的,不用擔心中途被欄截,也能夠享受合理的加解密速度。


所以 SSL 就安全了囉?

所以,只要對方 SSL 網站的憑證合格,上面有可靠的認證中心 ( CA) 簽名,把我的信用卡資料傳過去就安全囉?

不對。

仔細看看前段 SSL/X.509 簡介,就會注意到, SSL/X.509 規定中,認證中心 ( CA) 的簽名所保證的,只有 這個 Public Key 憑證的確是屬於這家公司的這個伺服器而已。也就是說,它只保證 妳送的信用卡號碼會確確實實交到這家公司的這個伺服器手中,不怕被任何人中途攔截監聽。但這並不代表 這家公司是優良企業,收到妳的信用卡資料後,不會濫用,不會側錄下來,不會多刷兩筆,不會轉手把資料賣給別家公司,也不代表 這家公司的伺服器安全防護做得很好,不會被人入侵,不會被人偷偷安裝側錄上網資料的程式

沒錯, SSL 只能保證收到的 Public Key 憑證不是偽造的,但不能保證這家公司本身沒有問題。就算這家公司本身沒有問題,也不能保證這家公司內部會不會成為別人入侵、竊取資料的目標。

那怎麼辦?怎麼樣才能算安全?才能放心把資料傳過去?

就像在實體世界,跟不認識的商店買東西時,一定會保持戒心一樣,在網路上和任何網站交易,也一定要保持戒心,除了要考慮妳平常信不信任這個網站外,也要考慮妳傳過去的資料重不重要。舉例來說,留言板、討論區、網路投票等等,不是很私人的資料,可以放心傳過去沒問題;但如果是真實姓名、手機號碼、家裏電話、信用卡號碼, E-mail 等等,就只能傳給自己信任的網站了。

什麼是數位簽名?

數位簽名是用 Private Key ,針對某一段資料,用 Digest Hash 演算法(如
SHA1 )做出來的一段 Digest 摘要碼。只要原來的資料有所不同,演算出來的 Digest 摘要碼就會跟著變動。用 Private Key 做出來的 Digest 摘要碼,可以用它的 Public Key 來檢查。只要用它的 Public Key ,檢查 Digest 摘要碼和那一段資料符不符合,就可以知道資料有沒有中途被竄改過,是不是這個 Private Key 當初簽的那一段資料。

這個性質很像合約中,在整份合約上大大簽一個名一樣,人家認得妳簽名的筆跡,日後只要合約有任何塗改,一認便知。所以我們把它叫做數位簽名。

因為數位簽名可以用來檢查資料有沒有被竄改,所以我們把它用在憑證上,認證中心檢查過 Public Key 的所有人,和 Key 上記載的所有人資料相符後,用認證中心自己的 Private Key ,在這些資料上面做個數位簽名,表示證明。日後收到這個 Public Key 的人,只要檢查上面認證中心的簽名,就可以知道這個 Key ,和它上面所載的所有人資料相不相符,是不是真的是這家公司的 Key 。也就知道,連上的這個伺服器,是不是真的是這家公司的伺服器了。

什麼是憑證?

憑證的原文是 Certificate ,是附上所有人 (owner) 的資料(公司名稱、伺服器名稱、個人真實姓名、連絡 E-mail 、通訊地址等資料),後面加上數位簽名的 Public Key 。憑證上會附有幾個數位簽名,代表這些簽名的人,確認過這個 Public Key 的所有人,和憑證上所載的資料相符,沒有假造。

在 X.509 中,最下層每一個合格的憑證 (Certificate) 上,會有一個認證中心 ( CA) 的簽名,表示這個認證中心 ( CA) 檢查過,確認憑證上的所有者資料無誤。當程式碰到沒見過的憑證時,只要檢查憑證上認證中心 ( CA) 的簽名無誤,即代表這個認證中心 ( CA) 查核過這個憑證 (Certificate) ,憑證上的資料無誤。

什麼是認證中心?

認證中心的原文是
CA ,是 Certificate Authority 的縮寫,在微軟正體中文 WINDOWS 上譯成 憑證授權憑證授權完全是逐字翻譯,意思不通,不用。認證中心是 X.509 的一環。認證中心也是一種憑證,上面附有認證中心本身的資料,但不是用來加解密,而是用來簽發憑證,證明憑證所有人和憑證上所載的資料無誤。請參見 SSL/X.509 簡介的附圖。

每一個合格的認證中心 ( CA) (微軟正體中文 WINDOWS 上譯成 中繼憑證授權,意思不通)上,會有一個管轄它的最高層認證中心 (Root CA) 的簽名,表示最高層認證中心授權給它,可以簽發別人的憑證。當程式碰到沒見過的憑證,憑證上簽名的認證中心 ( CA) 也沒見過時,只要檢查認證中心上附的最高層認證中心 (Root CA) 的簽名無誤,即代表這個最高層認證中心 (Root CA) ,認為這個認證中心 ( CA) 的憑證簽發過程很仔細,檢查資料很詳實,所以授權給它,准許它可以簽發憑證 (Certificate) 。所以這個認證中心 ( CA) 簽發的憑證 (Certificate) ,憑證上的資料也沒有問題。

什麼是最高層認證中心?

最高層認證中心的原文是 Root CA ,在微軟正體中文 WINDOWS 上譯成 根目錄憑證授權根目錄只是照 Root 這個字逐字翻譯,意思不通,不用。最高層認證中心是 X.509 的一環。最高層認證中心也是認證中心 ( CA) ,和一般認證中心的差別在於,它不會直接用來簽發憑證,而是授權給一些中間的認證中心,讓這些中間的認證中心來簽發憑證。請參見 SSL/X.509 簡介的附圖。


最高層認證中心,因為已經是最大,沒有再上層可以給它簽名了,所以憑證上的是自己的簽名,不是別人的簽名。因為最高層認證中心沒有再上面的簽名了,沒有人可以保證最高層認證中心本身有沒有問題,沒有辦法再往上檢查,所以程式只能事先就認得一些可靠的最高層認證中心,事先就知道一些可靠的最高層認證中心的 Public Key 。

最高層認證中心只能由一些著名、可靠的公司來擔任,因為沒有辦法再往上查驗。如果程式被加進一些不可靠的最高層認證中心,接下來碰到它簽下來的憑證,都會有問題,整個程式的安全都會被破壞。所以在 X.509 下, SSL 程式一定要好好保護最高層認證中心,一定要再三確認,不可以隨便讓人手動加進最高層認證中心。

如何填寫憑證申請書

如果妳不知道該如何填寫憑證申請書,請參考以下範例:



You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:TW
State or Province Name (full name) [Some-State]:Taiwan
Locality Name (eg, city) []:Taipei City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Tavern IMACAT's
Organizational Unit Name (eg, section) []:Owner
Common Name (eg, YOUR name) []:Tavern IMACAT's
Email Address []:imacat@mail.imacat.idv.tw
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

  1. 所有資料都要填英文 ( ASCII 字集) 。 X.509 憑證只接受英文 ASCII 字集的字。
  2. Country Name 一定要是大寫的雙字母國碼,臺灣是 TW ,臺灣以外的地方,請參考 ISO-3166 的標準雙字母國碼。
  3. State Name 是國名或省名,不可以填國碼。臺灣填 Taiwan 即可。
  4. Locality Name 是地名,填所在地縣市名即可。
  5. Organization Name 是組織單位名稱,填公司行號,或學校局處的名稱。
  6. Organizational Unit Name 是部門名稱,填公司部門名稱,或學校局處的單位名稱。
  7. Common Name 是憑證的名稱。若是最上層憑證機構,請填上前面填的組織單位名稱,後面可以加上 RSA/2048 ,以便日後辨認憑證的性質。若是伺服器憑證,請填上伺服器的全名 (www.abc.com) 。若是 E-mail 憑證,請填上妳的 E-mail
  8. E-mail Address 是申請單位的連絡信箱,請填上妳的聯絡用 E-mail
  9. A challenge password 是申請書的密碼。不過申請書不用設密碼,所以不填。
  10. An optional company name
    是憑證代辦公司的名稱,也不用填。

X.509 憑證制度的檢討

X.509 憑證制度,是靠事先認得一些可靠的最高層認證中心,再一層一層簽發下來的金字塔型結構。這樣的制度,很像信用卡制度或身份證制度:

X.509 制度
X.509 制度
信用卡制度
信用卡制度
身份證制度
身份證制度

這樣的金字塔結構,有好有壞。

好處在於,在無限寬廣的網際網路上,我們根本不知道會碰到什麼樣的網站,所以根本也無從查認每一個收到的 Public Key 有沒有問題,是不是真的是這家公司的網站,我是不是真的是跟這家公司打交道。在 X.509 下,只要我們預先認得幾家可靠的最高層認證中心就好了。碰到不認識的 Public Key 時,只要一層一層往上追溯,如果最後追溯得到一個我們認得的可靠的最高層認證中心,那這個 Public Key 就沒有問題了。這樣的做法,簡化了無限寬廣的網際網路上,確認彼此身份的困難性。


缺點則在於,因為 X.509 是金字塔結構,最高層認證中心 (Root CA) 手中握有整個網際網路信任關係的關鍵,權力太大了。龐大的權力,伴隨著的是龐大的利益。曾經跟認證中心打過交道(如 VeriSign 、 HiTrust 網際威信、Taica 臺灣網路認證等)的人都知道,申請簽發 SSL 憑證非常貴,一年年費要好幾萬,普通人或中小企業,需要 SSL 網站加密的時候,根本就負擔不起。而因為金字塔頂層的最高層認證中心,是壟斷事業,數目很少,不會有什麼競爭,所以大型的最高層認證中心姿態都很高,年費一直降不下來。但若不靠這些最高層認證中心,自己來發證,程式沒有內建我們自製的認證中心,連到 SSL 站上,一定會出現警告。小組織裏內部自用的 SSL 伺服器還沒有問題,我們可以自己加入自製的認證中心,但大型公開的伺服器(像公司網站)上,不可能要不認識的上網者信任我們的認證中心,把我們的認證中心加進去,這時候資料的安全,就會亮起紅燈了。到頭來,我們還是得回過頭去,求這些大型的認證中心,乖乖繳一年好幾萬的年費。

這真的沒有辦法嗎?

答案是否定的。即使是 X.509 的金字塔結構,至少就有兩條路:第一條路是像信用卡制度一樣。信用卡制度也是金字塔結構,頂層的信用卡集團也是壟斷事業,數目很少,可是信用卡的年費只有幾千塊錢。有競爭就會降價,但沒有競爭,並不代表價格一定降不下來。價格其實還是卡在認證中心如何定價,信用卡制度就是一例。第二是像身份證一樣,由政府出面經營,以政府的信用擔保、審核,把它變成免費的公用事業,讓大家有錢沒錢,都可以來用安全的網站交易。

不過,仔細想想,我們是不是一定要用 X.509 這種金字塔制度,任這些頂層的認證中心宰割,予取予求呢?

其實憑證有好幾種。有一種叫做 PGP ,是採用 信任網 (Web of Trust)的模式,建立信任關係。 PGP 的信任網就像人際關係網一樣:我認得妳,妳認得她,所以我只要請妳來認她就好了。

PGP 的信任網

PGP 的信任網

在 PGP 信任網模式下,我們不需要一個最高層認證中心,給每個人核發憑證,才能取得 Public Key 的安全性。我們只要信任我們自己的 Public Key 憑證,用自己的憑證去簽認識的 Public Key 的憑證,別人也用他們自己的憑證,去簽他們認識的人的憑證,往外一層一層擴散出去,互相信任。碰到不認得的憑證時,只要能夠從他憑證上的簽名中,回溯到可信任的人的憑證身上,就可以了。其實事情本來就是這樣。我們為什麼要向別人繳一年好幾萬的年費,還要別人簽名,才能信任自己的憑證呢?

不過,不合理的是, SSL 規定,要用 X.509 。

其她 SSL/X.509 憑證的做法

在本文中,我們做了兩個憑證:一個是 Root CA 最上層認證中心,一個是用這個最高層認證中心簽發的憑證。

其實完整的話,應該要做三層(參考: SSL/X.509 簡介中的附圖):最高層認證中心 (Root CA) ,中間的認證中心 ( CA) ,最後才簽發下面的憑證。可是我不會做中間的認證中心, ^^; 完整的三層挺複雜的。而且,最高層認證中心 (Root CA) 只是 不會用來直接簽憑證,而不是 不能用來直接簽憑證,最高層認證中心(Root CA) 簽的憑證,一樣有效。更何況,我們通常都只有幾台伺服器,只需要幾個憑證就好,不需要授權好幾個中間的認證中心,來讓它們簽憑證。所以我們就省略了中間的認證中心,直接用最高層認證中心 (Root CA) 來簽發憑證 (Certificate) 。

其實還有兩個不那麼麻煩的做法。 Apache mod_ssl 有隨附一個
印度蛇油公司 (Snake Oil)的最高層認證中心 (Root CA) ,內有印度蛇油 (Snake Oil CA) 的 Private Key ,可以直接用印度蛇油認證中心 (Snake Oil CA) 的名義來簽發憑證。只要在編譯 Apache 時, make 以後打 make certificate ,就會自動用印度蛇油認證中心,簽發 Apache 網站所需的伺服器憑證了。可是,基於安全上的理由,妳只能夠用這張簽出來的網站憑證,絕對不可以把印度蛇油認證中心 (Snake Oil CA) ,加到程式認得的認證中心中。因為印度蛇油的 Private Key 是隨著 Apache mod_ssl 公開散佈的,任何人只要下載 Apache mod_ssl ,裏面就會有印度蛇油的 Private Key ,就可以用印度蛇油的名義來簽憑證,自稱為某某公司。印度蛇油的可靠度是零,絕對不要加進程式中。(所以才叫做印度蛇油 Snake Oil ,騙人的。)

另一個方法,是只做一個最高層認證中心 (Root CA) ,直接用這個最高層認證中心,來當伺服器的憑證。因為最高層認證中心 (Root CA) 本身,也是一個憑證,所以當然也可以用,一樣有效。這時候,最高層認證中心的所有人名稱,就要用伺服器的名稱 (www.abc.com) ,而不是單位的名稱 (ABC Corporation.) 。這個方法,適合只有一個伺服器,只需要一個憑證,而且不在乎憑證名稱的人。用 Windows NT/2000 的 Certificate Server 憑證伺服器,可以做出這種憑證。但如果有好幾臺伺服器,每個憑證都要分別去加到每臺電腦上,這個方法就不大方便了。

註釋

  1. FHS 是指 Filesystem Hierarchy Standard 檔案系統階層標準
    ,是一個 Unix 下,目錄及檔案存放位置的標準規定,以方便系統管理員管理,方便不同程式間互相搭配整合。目前大多數 Linux 版本(如 DebianRed HatMandrake 等)都已支援 FHS 。更進一步的資料請參考 FHS 的網站 http://www.pathname.com/fhs/
  2. Opera 截至目前為止 (6.05) ,只支援 RSA ,不支援 DSA
  3. 在 Mandrake 下裝 RPM 時,請改用:


    mv /usr/lib/ssl/openssl.cnf /etc/ssl
    ln -s /etc/ssl/openssl.cnf /usr/lib/ssl/openssl.cnf

  4. 這是 bash 或 zsh 的指令。 csh 或 tcsh 下,請改用:


    setenv OPENSSL_CONF "/etc/ssl/openssl.cnf"

  5. 這樣以後登入的時候,都能夠自動設定 OPENSSL_CONF 。這是用 bash 登入的情形,若用 csh 或 tcsh 登入,請改用:


    echo "# OpenSSL 設定檔的位置" >> ~/.cshrc
    echo "setenv OPENSSL_CONF \"/etc/ssl/openssl.cnf\"" >> ~/.cshrc

    若用 zsh 登入,請改用:


    echo "# OpenSSL 設定檔的位置" >> ~/.zshenv
    echo "export OPENSSL_CONF=\"/etc/ssl/openssl.cnf\"" >> ~/.zshenv

  6. (感謝 網中人 (netman) 提供)若妳安裝的是 Red Hat 的 openssl RPM ,在這裏會出一點問題。 Red Hat 的 openssl 做 rand 指令,配合 -out 參數時,參數解析會出錯,無法執行。目前我還沒有看到網路上有人提過這件事。解決方法之一,是自己編譯、安裝 OpenSSL 。這其實很簡單。在 Linux 上,步驟如下:


    ./config shared --prefix=/usr --openssldir=/usr/share/ssl
    make
    make install

    在其她作業系統 (*BSD/UNIX) 上,步驟如下:


    ./config --prefix=/usr --openssldir=/usr/share/ssl
    make
    make install

    如果不想自己編譯、安裝 OpenSSL ,另一個解決方法,由網中人提供,則是避開 -out 參數,改用輸出重導向:


    openssl rand 1024 > /etc/ssl/private/.rand

    Mandrake 和 Debian 的 openssl 套件沒有這個問題。
  7. 若要做成 DSA Key,請改用:


    # 製作 DSA 參數檔
    openssl dsaparam -out /tmp/dsaparam 2048
    # 製作 DSA Private Key
    openssl gendsa -out /etc/ssl/private/myrootca.key.pem /tmp/dsaparam
    chmod og-rwx /etc/ssl/private/myrootca.key.pem
    # 刪除 DSA 參數檔
    rm -f /tmp/dsaparam

    因為 DSA 取亂數參數要取很久,所以 OpenSSL 不直接做 DSA Key ,而把取出來的 DSA 參數存檔,再用參數檔來做 DSA Key ,做下一組 Key 時就可以用同一個參數檔,以節省時間。不過這裏我們只做一組 Key ,所以參數檔用過就可以刪了。
  8. 若妳的最高層認證中心,放在另一臺伺服器上,請將 /tmp/ myhost.req.pem 複製到那臺伺服器上的 /tmp/ myhost.req.pem ,登入那臺伺服器上,再繼續進行。
  9. 如果妳原來是在另一臺伺服器做這組 Public/Private Key 的,把 /etc/ssl/certs/ myhost.crt.pem 複製到原來的伺服器上的 /etc/ssl/certs/ myhost.crt.pem ,就可以用了。記得要回到原來的伺服器上,把原來伺服器上的憑證申請書 /tmp/ myhost.req.pem 也刪掉。


    rm -f /tmp/myhost.req.pem

  10. 在 Mandrake 下裝 RPM 時,請改用:


    cp /usr/lib/ssl/openssl.cnf ~/etc/ssl

  11. 這是 bash 和 zsh 的指令。 csh 或 tcsh 下,請改用:


    setenv OPENSSL_CONF "$HOME/etc/ssl/openssl.cnf"

  12. 這樣以後登入的時候,都能夠自動設定 OPENSSL_CONF 。這是用 bash 登入的情形,若用 csh 或 tcsh 登入,請改用:


    echo "# OpenSSL 設定檔的位置" >> ~/.cshrc
    echo "setenv OPENSSL_CONF \"$HOME/etc/ssl/openssl.cnf\"" >> ~/.cshrc

    若用 zsh 登入,請改用:


    echo "# OpenSSL 設定檔的位置" >> ~/.zshenv
    echo "export OPENSSL_CONF=\"$HOME/etc/ssl/openssl.cnf\"" >> ~/.zshenv

  13. (感謝 網中人 (netman) 提供)若妳安裝的是 Red Hat 的 openssl RPM ,在這裏會出一點問題。 Red Hat 的 openssl 做 rand 指令,配合 -out 參數時,參數解析會出錯,無法執行。目前我還沒有看到網路上有人提過這件事。解決方法之一,是自己編譯、安裝 OpenSSL 。這其實很簡單。在 Linux 上,步驟如下:


    ./config shared --prefix=/usr --openssldir=/usr/share/ssl
    make
    make install

    在其她作業系統 (*BSD/UNIX) 上,步驟如下:


    ./config --prefix=/usr --openssldir=/usr/share/ssl
    make
    make install

    如果不想自己編譯、安裝 OpenSSL ,另一個解決方法,由網中人提供,則是避開 -out 參數,改用輸出重導向:


    openssl rand 1024 > ~/etc/ssl/private/.rand

    Mandrake 和 Debian 的 openssl 套件沒有這個問題。
  14. 若要做成 DSA Key,請改用:


    # 製作 DSA 參數檔
    openssl dsaparam -out ~/tmp/dsaparam 2048
    # 製作 DSA Private Key
    openssl gendsa -out ~/etc/ssl/private/myrootca.key.pem ~/tmp/dsaparam
    chmod og-rwx ~/etc/ssl/private/myrootca.key.pem
    # 刪除 DSA 參數檔
    rm -f ~/tmp/dsaparam

    因為 DSA 取亂數參數要取很久,所以 OpenSSL 不直接做 DSA Key ,而把取出來的 DSA 參數存檔,再用參數檔來做 DSA Key ,做下一組 Key 時就可以用同一個參數檔,以節省時間。不過這裏我們只做一組 Key ,所以參數檔用過就可以刪了。
  15. 若妳的最高層認證中心,是由 root 管理,請接到 root 的第三步驟。
  16. 如果妳原來是在另一臺伺服器做這組 Public/Private Key 的,把 ~/etc/ssl/certs/ myhost.crt.pem 複製到原來的伺服器上的 ~/etc/ssl/certs/ myhost.crt.pem,就可以用了。記得要回到原來的伺服器上,把原來伺服器上的憑證申請書 /tmp/ myhost.req.pem 也刪掉。


    rm -f /tmp/myhost.req.pem

  17. 不過微軟的 Outlook Express 很笨,不支援相容性高的 TLS 新標準,只能跑舊式的 SMTPS 。若妳要設定給 Outlook Express 用 SSL 寄信,就一定要在編譯時加上 SMTPS 的支援。
  18. 其實妳會看到三個連接埠: SMTP(25) 、 SMTPS(465) 和 submission(587) 。 submission(587) 是給郵件程式寄信專用的,和 SMTP(25) 一樣可以做 TLS 。 submission(587) 不需特別設定,為簡化討論起見,省略之。
  19. 若妳在意系統安全,不想多開不必要的帳號的話,這裏的 smmsp 可以改成 mail ,用 mail 帳號。我強烈建議這個做法。開太多不必要的帳號,增加不必要的系統權限,也是安全漏洞的來源之一。本來就沒有什麼程式在用 mail 帳號, mail 是閒置的系統帳號之一,不如好好利用這個現有的系統資源。更何況, Sendmail 建議的 smmsp 群組的 GID 25 ,和 Debian floppy 群組的 GID 衝突。這是系統安全的題外話,和 SSL 無關。
  20. 這裏 MS-WINDOWS 把 最高層認證中心 (Root CA)譯成 根目錄憑證授權,把 認證中心 ( CA)譯成 憑證授權中繼憑證授權,都是逐字翻譯的結果,完全不知所云,翻譯之大忌,戒之。

  21. 到 Mozilla 1.1 版為止, Mozilla 把 憑證 (Certificate)譯成 認證,把 認證中心 ( CA)譯成 查證,也是有問題的譯法,且不符目前的通譯。我已跟 Mozilla 中文化的作者林弘德反映過這個問題,他承諾於 1.0.1 版後修正。
  22. 實際儲存的地方,在 Mozilla 使用者設定檔目錄下的 cert7.db ,格式是 Berkeley DB 。
  23. 我還沒找到直接開啟 [Certificate Infomation Manager] 的方法。如果有人知道,煩請告訴我。
  24. 實際儲存的地方,公用的認證中心在 Eudora 程式目錄下的 rootcerts.p7b ,個人的認證中心在 Eudora 信箱目錄下的 usercerts.p7b ,格式是標準憑證格式 DER 的 PKCS#7 檔。
  25. 要先失敗一次,才能去設定,其實挺蠢的。另一個 比較不那麼愚蠢的方法,就是直接去改 usercerts.p7busercerts.p7b 是標準憑證格式 PKCS#7 檔,可以用 OpenSSL 處理:


    # 備份原檔案
    mv usercerts.p7b usercerts-orig.p7b
    # 把 DER 的 PKCS#7 檔,拆成一張一張的 PEM 憑證清單
    openssl pkcs7 -print_certs -inform der \
    -in usercerts-orig.p7b -out certslist.pem
    # 把我們的認證中心加進來
    cat /etc/ssl/certs/myrootca.crt.pem >> certslist.pem
    # 將一張一張的 PEM 憑證清單,組合成 PEM 的 PKCS#7 檔
    openssl crl2pkcs7 -nocrl -certfile certslist.pem > usercerts.pem
    # 將 PEM 轉為 DER
    openssl pkcs7 -in usercerts.pem -outform der -out usercerts.p7b
    # 刪掉多餘的檔案
    rm -f certslist.pem usercerts.pem

    這樣就把我們的認證中心加進 usercerts.p7b 了。不要直接去改公用的認證中心 rootcerts.p7b ,這個檔案留給 Eudora 自己去維護。
  26. 詳情請參見這篇 Becky! 論壇上關於 SSL 的討論

參考資料

  1. SSL: Netscape Security Documentation, Introduction to SSL, How SSL Works, SSL Protocol v3.0
  2. X.509: RFC 3280,
    RFC 2459 (舊版)
  3. OpenSSL: OpenSSL, openssl(1), x509(1), req(1), ca(1)
  4. PGP: GnuPG, PGPi, PGP, Introduction to Cryptography ( PDF 檔, PGP 的原作者 Phil Zimmermann 作), Phil Zimmermann
  5. FHS

  6. TLS 1.0: RFC 2246
  7. Apache: http://www.apache.org/, Apache-SSL, mod_ssl
  8. Qpopper
  9. Sendmail
  10. Stunnel

後記

2002-11-15

小幅更新:

  • 加上 Sendmail SMTPS(465) 功能的設定。這是 Sendmail 未公開的功能,之前在 Sendmail 文件中沒有發現。我是在設定 Outlook Express 時,發現沒辦法按自己寫的方式用 SSL 寄信,上 google 搜尋,才發現 Sendmail 的 SMTPS 支援的。不好意思,寫出無法執行的東西,自己沒有全部檢查確認過,對大家非常抱歉。 ^^;
  • 加上 Stunnel SSL 包裝程式。這是可以讓 Becky! 等不支援 SSL 的程式,也能使用 SSL 連線的方法。
  • 加註不新增 smmsp
    帳號的方法。
  • 幾個之前編排文字時造成的小錯誤。
2002-09-15

本文參考的資料有限。 SSL 和 X.509 我還沒有完整看過。而目前網路上,即使是英文資料也很少。一開始,我只能從一堆零零散散的網路討論,和 OpenSSL 的文件中,自己拼湊出 SSL 憑證的做法。因為網路上找不到比較完整的 SSL 憑證製作教學,所以我想把它寫出來,開個先鋒。我沒有看完 SSL/X.509 ,只是儘量讓我做出來的憑證,在我所知道的 SSL 程式上,都跑得動。做出來憑證不一定完全符合 SSL/X.509 ,也不一定在所有的 SSL程式上都能用。

然而,也不是每一個符合 SSL/X.509 的憑證,就能在所有的 SSL 程式上用。不見得每個 SSL 程式都完整支援 SSL/X.509 ,就像 Opera 目前還不支援 DSA 一樣。

本文第一版是 2002-01-09 ~ 2002-01-13 間所寫。第一版寫作的目的,是當時為了想自己做 Root CA (這樣憑證看起來比較好看),想辦法在網路上零碎的討論中,拼湊出 Root CA 的做法。整個做法有點複雜,怕自己下次要發憑證時忘記,所以寫下來,順便寫成 HOWTO 教學的形式,以把這個知識分享給大家。因為只是為了快點記下繁複的做法,寫得很倉促,交代也不清不楚。

這是第二版,是 2002-09-04 ~ 2002-09-15 間改寫的,當初改寫的目的,是這兩三個月來,收到好幾封信詢問這篇文章,覺得自己這篇文章,交代得不清不楚,所以重新改寫。因此原先改寫的時候,著重在 WHAT 和 WHY 的說明,把
SSL/X.509 架構,交代得比較嚴謹,也把腦子裏想的幾張流程圖,都給畫出來。不過到後來, HOW 的部份,也大幅度地改寫,重新編排流程,實驗各種情況,更正幾個錯誤,改善原來的設定,統整辭彙的翻譯,加上流程的說明。原文 2,931 字,改寫後 18,421 字, ^^; 改寫的幅度很大。

感謝 study-area網中人 (netman) 協助校正好幾個錯誤、疏漏之處。

希望改寫後,能讓這篇文章更好,更嚴謹,也更容易入手。

依瑪貓,初稿 2002-01-09 ,上次更新日期 2006-04-06

原文出處: 依瑪貓:如何製作 SSL X.509 憑證?
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉載][LAMP]SSL介紹

[LAMP]SSL介紹

SSL介紹: 出處
SSL(Secure Socket Layer)是Netscape所提出來的資料保密協定,採用了RC4、MD5,以及RSA等加密演算法。


網路上需要確定網站真的是那個網站,所以SSL也具備認證的機能。SSL是以金字塔的結構
組成,最下層的是一般的伺服器,它們經由向上跟CA申請取得SSL的憑證,CA會在SSL相關檔案上籤名,CA是具有公信力和認證能力的機構,CA必須向上跟RootCA(如政府機構等)申請。當使用者連結具SSL的服務時,伺服器會傳送憑證給使用者,使用端的程式接收到憑證後會向CA確認憑證,若CA確認這個憑是它們簽發的則會回傳給使用端正確的訊息。
具有SSL功能的網站可以向 世界少數幾個發證機構(例如目前最大的VeriSign或第二大的Thawte兩家認證公司)申請,經過嚴格的文件證明確認後,才能取得國際認可(較新版 的MSIE或Netscape瀏覽軟體會自動認得)的電子認證。




所有 SSL憑證都是發給公司或是法人,典型的 SSL 憑證將包括您的網域名稱(domain name)、您的公司名稱(company name)、您的住址(address)、您的所在城市(city)、您的省份(state)和您的國家(country),它也包含了憑證的到期日和負責核發此憑證的發證中心詳細資料。當一個瀏覽器連結到一個安全網站時,它將收到這個網站的SSL憑證並且檢驗它是否過期、它是否是已經被瀏覽器信任的發證中心所核發的,以及它是否如核發時 所登記的內容被該網站使用,假如有任何一項檢查不通過,瀏覽器將顯示一個警告訊息給使用者。



在Ubuntu上安裝 apache+mysql+php+openssl

sudo tasksel install lamp-server
安裝 lamp (apache mysql php)

sudo apt-get install mysql-admin mysql-gui-tools-common mysql-query-browser
安裝mysql的管理介面

sudo apt-get install -y php5-gd
安裝GD庫

sudo apt-get install -y openssl
安裝Openssl

sudo apt-get install -y ssl-cert
安裝簽署憑證的工具

sudo a2enmod ssl
安裝ssl模組


sudo cp /etc/apache2/sites-available/default /etc/apache2/sites-available/ssl
sudo ln -s /etc/apache2/sites-available/ssl /etc/apache2/sites-enabled/ssl
複製一份預設擋供ssl用,並且用ln建立連結(捷徑)至sites-enabled/ssl

sudo vim /etc/apache2/sites-enabled/ssl
在以下位置後面加入紅色的設定值

NameVirtualHost *:443

sudo vim /etc/apache2/sites-enabled/default
在以下位置後面加入紅色的設定值

NameVirtualHost *:80
SSLEngine On
SSLCerficationFile /etc/apache2/etc/apache.pem

sudo vim /usr/sbin/make-ssl-cert
將"-keyout $output"改成"-keyout $output -days 3650"即可將憑證有效時間改成10年

sudo mkdir /etc/apache2/ssl
建立ssl憑證所擺放目錄


sudo make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /etc/apache2/etc/apache.pem

make-ssl-cert is a wrapper of OpenSSL
依照指示輸入憑證相關訊息,即可產生自簽的電子證書!

sudo /etc/init.d/apache2 force-reload
重新載入配置

sudo /etc/init.d/apache2 restart
重新啟動Apache2
產生自簽的CA
產生自簽的CA的意義是,自己架設一個CA,並為自己的伺服器的憑證簽名。則使用端收到憑證時,會向CA確定,這時就用自己架的CA去確認說憑證是有效的。當然這樣是沒有公信力的,而且把自己架的伺服器登記為CA需要手動加入,一般這樣做都是為了測試用。



參考以下連結

http://wiki.ubuntu.org.cn/OpenSSL
主要做兩件事情

第一件是架CA:Creating the Certificate Authority

第二件是架server:Creating a Self-Signed Server Certificate

並使用自己的CA為它簽名


原文出處:PHP 程式 學習 筆記本: [LAMP]SSL介紹
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉載]如何製作 SSL X.509 憑證?(前半)

冷日說在前面:
這篇事實上就是第一篇的重複轉載!
但是因為冷日發現當年轉載的時候居然斷掉了,所以重新轉載一次!

如何製作 SSL X.509 憑證?

目錄

  1. 前言
  2. 若妳是 root
    1. 設定 OpenSSL 的環境
    2. 製作最高層認證中心 (Root CA)
      1. 製作 Public/Private Key
      2. 填寫憑證申請書
      3. 簽發憑證
    3. 製作伺服器用的憑證
      1. 製作 Public/Private Key
      2. 填寫憑證申請書
      3. 簽發憑證
  3. 若妳是一般使用者
    1. 設定 OpenSSL 的環境
    2. 製作最高層認證中心 (Root CA)
      1. 製作 Public/Private Key
      2. 填寫憑證申請書
      3. 簽發憑證

    3. 製作伺服器用的憑證
      1. 製作 Public/Private Key
      2. 填寫憑證申請書
      3. 簽發憑證
  4. 設定伺服器
    1. HTTP
      1. Apache
    2. POP3
      1. Qpopper
    3. SMTP
      1. Sendmail
  5. 設定作業系統
    1. MS-WINDOWS
  6. 設定瀏覽器
    1. Mozilla 與 Netscape 6 以後的版本
    2. Internet Explorer
    3. Opera
    4. Lynx
  7. 設定電子郵件程式
    1. Mozilla 與 Netscape 6 以後的版本
    2. Netscape 4 及更早的版本

    3. Outlook Express 6
    4. Outlook Express 5.5
    5. Outlook Express 4/5
    6. Eudora 5.1 以後的版本
    7. Becky!
    8. Opera 郵件
  8. 設定其她不支援 SSL/TLS 的程式
    1. Stunnel
  9. 觀念討論
    1. SSL/X.509 簡介
    2. 憑證無效的警告
    3. 資料?什麼資料?
    4. 所以 SSL 就安全了囉?
    5. 什麼是數位簽名?
    6. 什麼是憑證?
    7. 什麼是認證中心?
    8. 什麼是最高層認證中心?
    9. 如何填寫憑證申請書
    10. X.509 憑證制度的檢討
    11. 其她 SSL/X.509 憑證的做法
  10. 註釋
  11. 參考資料
  12. 後記

前言

版權所有 © 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 , DSARSA 都可以,但因為還有一些 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 憑證可以做為 myhostSSL 憑證,用在 HTTPSPOP3S/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 憑證可以做為 myhostSSL 憑證,用在 HTTPSPOP3S/TLS/SSL 上。

設定伺服器

常見的 SSL 通訊方式有兩種:一種是傳統的 SSL ,一種是新的 TLS

傳統的 SSL ,一連上伺服器,就進入 SSL , 全程加密。這樣做有一個缺點:為了不讓使用者程式混淆,要把 SSL 開在另外一個 TCP 埠,還要設定使用者的程 式,改連到 SSL 的那個 TCP 埠去。 HTTPHTTPS 的方式就是這樣。

新的 TLS ,則是在使用者程式連上伺服器後,下 STARTTLS 指令,如果伺服器有 SSL ,就會進入 SSL ,雙方開始加密;如果伺服器沒有 SSL ,看 不懂 STARTTLS
,雙方就按原來的方式繼續連線。這樣做的好處 是,使用者程式不用改設連接埠,可以自行切入 SSL 或退回不 加密連線,相容性高,也不用為了 SSL ,多開一個 TCP 埠。但 TLS 的缺點則是,就算憑證查核的結 果有問題,不能做 SSL ,還是可以退回原來的方式繼續連線, 那憑證查核的工作,有做等於沒做。只有連線加密的的優點而已,無法查證伺 服器的身份。

以下依不同的通訊協定,分別討論。

HTTP

HTTP 是最早用 SSL 的通訊協定。 Netscape 當初是為了加密 HTTP ,做安全網路交易,才設計了 SSL ,開一個新的 TCP 埠 443 給它專用,取 名為 HTTPS ,延用至今。因此, HTTPSSL 用的是傳統的方式,沒有 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

要是沒有問題,重開 httpdSSL 網站就開 跑了。

POP3

POP3 可以跑兩種方式:傳統用 POP3S(995) 埠專跑 SSL ,或是用 TLS ,在原來的 POP3(110) 埠上,加上 STARTTLS 的功能。

POP3TLS 指令是 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]

SMTPTLS 指令是 STARTTLS

Sendmail

Sendmail 可以在編譯時,加入 SMTPSTLS的支援,不過 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 憑證教學
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉載]OpenLDAP-SSL TLS 設定


OpenLDAP-SSL TLS 設定






前言



  • LDAPv3 用戶端認證機制 (Authentication)

    • Anonymous:使用空的 DN 及密碼 (換句話說就是什都不用輸入)

    • Simple:需輸入帳號及密碼,並以 明文 方式傳輸

    • SSL/TLS:需輸入帳號及密碼,並以 加密 方式 (需安裝
      [OpenSSL]) 傳輸
      [RFC2830]

    • SASL:用戶端與伺服器在進行任何憑證 傳輸前先協商 所使用的認證機制 (Cyrus-Sasl)
      [RFC2222]




另外有個很重要的觀念在
[OpenLDAP Faq-O-Matic: How do I use TLS/SSL?] 內有提到,LDAP 服務走 StartTLS 就用 ldap:// 來連接 (Port 389),若是 SSL 才是 ldaps:// 來連接 (Port 636)



  1. ldap:// + StartTLS should be directed to a normal LDAP port (normally 389), not the ldaps:// port.

  2. ldaps:// should be directed to an LDAPS port (normally 636), not the LDAP port.


實作環境



  • FreeBSD 6.1-STABLE

  • openldap-server-2.3.24

  • openldap-sasl-client-2.3.24

  • OpenSSL 0.9.7e-p1 25 Oct 2004


安裝及設定


步驟1.製作 RootCA 的 Private Key (rootca.key)



[SSL] 採用的是
[X.509] 由上而下金字塔式的憑證制度 (Root CA >> CA >> Certificate)


 #cd /usr/local/etc/openldap/ssl                               //切換路徑
#openssl genrsa -des3 -out rootca.key 2048 //產生最上層的 Private Key (rootca.key)
Generating RSA private key, 2048 bit long modulus
......................................................................+++
..........+++
e is 65537 (0x10001)
Enter pass phrase for rootca.key: //輸入密碼 (Rootca 的 Private key 密碼)
Verifying - Enter pass phrase for rootca.key: //再輸入一次密碼 (Private key 的密碼)

步驟2.填寫 RootCA 憑證申請書 (rootca.csr)


 #openssl req -new -key rootca.key -out rootca.req                                     //產生 rootca.csr(憑證申請書)
Enter pass phrase for rootca.key: //輸入密碼 (Rootca 的 Private key 密碼)
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:TW //國碼臺灣是 TW
State or Province Name (full name) [Some-State]:Taiwan R.O.C //國名臺灣填 Taiwan
Locality Name (eg, city) []:Taipei //地名
Organization Name (eg, company) [Internet Widgits Pty Ltd]:FreeBSD Personal Reserach //組織單位名稱
Organizational Unit Name (eg, section) []:FreeBSD Personal Reserach //部門名稱
Common Name (eg, YOUR name) []:Weithenn-Wang //憑證的名稱
Email Address []:weithenn@weithenn.org //申請單位的連絡信箱
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:按Enter直接跳過 //申請書的密碼
An optional company name []:按Enter直接跳過 //憑證代辦公司的名稱

步驟3.簽發憑證 rootca.crt (因為自已是 RootCA 所以自己簽給自己)


最高層認證中心最好永遠不要過期。要是過期重簽,所有原來它簽發的憑證也都要重簽,所有
[SSL] 程式也都要重新設定。所以此次我們設定效期為 7305 天 (20年)。若不設效期的話,預設是 30 天(一個月)


 #openssl x509 -req -days 7305 -sha1 -extfile /etc/ssl/openssl.cnf -extensions v3_ca -signkey rootca.key -in rootca.req -out rootca.crt
Signature ok
subject=/C=TW/ST=Taiwan R.O.C/L=Taipei/O=FreeBSD Personal Reserach/OU=FreeBSD Personal Reserach
/CN=Weithenn-Wang/emailAddress=weithenn@weithenn.org
Getting Private key
Enter pass phrase for rootca.key: //輸入密碼(Rootca 的Private key密碼)

步驟4.製作 LDAP 伺服器用的 Private Key (ldap.weithenn.org.key)


請注意 LDAP 伺服器的 Private Key 建議不要設密碼,否則
[SSL] 伺服器程式啟動時,讀取憑證和 Private Key 時就要詢問一次密碼。


 #openssl genrsa -out ldap.weithenn.org.key 2048    //產生伺服器用的 Private  key (ldap.weithenn.org.key)
Generating RSA private key, 2048 bit long modulus
......................................................+++
......+++
e is 65537 (0x10001)

步驟5.LDAP 伺服器憑證申請書 (ldap.weithenn.org.csr)


 #openssl req -new -key ldap.weithenn.org.key -out ldap.weithenn.org.csr                 //產生伺服器憑證申請書 (ldap.weithenn.org.csr)
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]: TW //國碼臺灣是 TW
State or Province Name (full name) [Some-State]: Taiwan R.O.C //國名臺灣填 Taiwan
Locality Name (eg, city) []: Taipei //地名
Organization Name (eg, company) [Internet Widgits Pty Ltd]: FreeBSD Personal Reserach //組織單位名稱
Organizational Unit Name (eg, section) []: FreeBSD Personal Reserach //部門名稱
Common Name (eg, YOUR name) []: ldap.weithenn.org //憑證的名稱 (伺服器的 FQDN,很重要後面會用到)
Email Address []: weithenn@weithenn.org //申請單位的連絡信箱
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: 請按 Enter 直接跳過 //申請書的密碼
An optional company name []: 請按 Enter 直接跳過 //憑證代辦公司的名稱

步驟6.最高層認證中心簽發憑證 (RootCA 發給 LDAP 伺服器)


以最高層認證中心發給伺服器 (RootCA >> LDAP Server) 十年的憑證。


 #openssl x509 -req -days 3650 -sha1 -extfile /etc/ssl/openssl.cnf -extensions v3_req -CA rootca.crt -CAkey rootca.key \
-CAserial rootca.srl -CAcreateserial -in ldap.weithenn.org.csr -out ldap.weithenn.org.crt //接續上一行
Signature ok
subject=/C=TW/ST=Taiwan R.O.C/L=Taipei/O=FreeBSD Personal Research/OU=FreeBSD Personal Research
/CN=www.weithenn.org/emailAddress=weithenn@weithenn.org
Getting CA Private Key
Enter pass phrase for rootca.key: //輸入密碼 (Rootca 的 Private key 密碼)

以上步驟完成後整理一下剛才產生的檔案


 /usr/local/etc/openldap/ssl/rootca.key                //RootCA Private Key (記得權限設為 400)
/usr/local/etc/openldap/ssl/rootca.csr //RootCA 憑證申請書
/usr/local/etc/openldap/ssl/rootca.crt //RootCA 憑證
/usr/local/etc/openldap/ssl/ldap.weithenn.org.key //LDAP ServerPrivate Key (記得權限設為 400)
/usr/local/etc/openldap/ssl/ldap.weithenn.org.csr //LDAP Server 憑證申請書
/usr/local/etc/openldap/ssl/ldap.weithenn.org.crt //LDAP Server 憑證

步驟7.修改 LDAP 設定檔 (slapd.conf)


修改 LDAP 設定檔 (slapd.conf) 加入以下 TLS 相關設定


 TLSCipherSuite          HIGH:MEDIUM:+SSLv2:+SSLv3:TLSv1
TLSCACertificateFile /usr/local/etc/openldap/ssl/rootca.crt //Root CA certs
TLSCertificateFile /usr/local/etc/openldap/ssl/ldap.weithenn.org.crt //LDAP Server certs
TLSCertificateKeyFile /usr/local/etc/openldap/ssl/ldap.weithenn.org.key //LDAP Server Private Key
TLSVerifyClient try

步驟8.修改 PAM 設定檔 (ldap.conf)


修改 PAM 設定檔 (ldap.conf) 加入以下 TLS Client相關設定


 #vi /usr/local/etc/openldap/ldap.conf
HOST 127.0.0.1
URI ldap://ldap.weithenn.org //請注意此欄位為填入產生伺服器憑時的 CN
BASE dc=weithenn, dc=org
TLS_CACERT /usr/local/etc/openldap/ssl/rootca.crt
TLS_REQCERT demand

步驟9.修改 rc.conf


修改 /etc/rc.conf 加入以下 TLS 相關設定


 slapd_flags='-h "ldapi://%2fvar%2frun%2fopenldap%2fldapi/ ldap://0.0.0.0/"'                  //若是 SSL start_tls 則不用改
slapd_flags='-h "ldapi://%2fvar%2frun%2fopenldap%2fldapi/ ldap://0.0.0.0/ ldaps://0.0.0.0/"' //若是 SSL On 則改成此行

步驟10.修改 PAM 設定檔 (ldap.conf)


修改 PAM 設定檔 (ldap.conf、也就是 pam_ldap、nss_ldap) 加入以下 TLS 相關設定


 #vi /usr/local/etc/ldap.conf
uri ldap://ldap.weithenn.org //若是使用 SSL On 請改成 ldaps://
ssl start_tls //StartTLS (注意 start_tls 是走 Port 389,若為 On 才是走 Port 636)
tls_checkpeer yes //是否要求驗證 LDAP Server 憑證
tls_cacertfile /usr/local/etc/openldap/ssl/rootca.crt //指定 RootCA 憑證
tls_cacertdir /usr/local/etc/openldap/ssl //指定 RootCA 目錄

步驟11.重新啟動 slapd 服務


鍵入以下指令來重新啟動 LDAP 服務


 #/usr/local/etc/rc.d/slapd restart                        //重新啟動 slapd 服務

查看 SSL/TLS Port是否開啟


 #sockstat |grep ldap
ldap slapd 81896 3 dgram -> /var/run/logpriv
ldap slapd 81896 6 stream /var/run/openldap/ldapi
ldap slapd 81896 7 tcp4 *:389 *:*
ldap slapd 81896 8 tcp4 *:636 *:* //若使用 SSL On 則應該開啟此 Port

查看 /var/log/ldap.log 可看到 TLS 已經作用了


 Jul 25 17:30:00 ldap slapd[81896]: conn=9 fd=12 ACCEPT from IP=127.0.0.1:58956 (IP=0.0.0.0:636)    //SSL ON
Jul 25 17:30:00 ldap slapd[81896]: conn=9 fd=12 TLS established tls_ssf=256 ssf=256
Jul 25 17:30:00 ldap slapd[81896]: conn=9 fd=12 closed (connection lost)

步驟12.測試 SSL Connection


 #openssl s_client -connect localhost:636 -showcerts -state -CAfile /usr/local/etc/openldap/ssl/rootca.crt   //指令執行後可看到如下訊息
SSL_connect:SSLv3 read server certificate A
SSL_connect:SSLv3 read server certificate request A
SSL_connect:SSLv3 read server done A
SSL_connect:SSLv3 write client certificate A
SSL_connect:SSLv3 write client key exchange A
SSL_connect:SSLv3 write change cipher spec A
SSL_connect:SSLv3 write finished A
SSL_connect:SSLv3 flush data
SSL_connect:SSLv3 read finished A

參考



[ OpenLDAP Server With Server-Side SSL/TLS and Client Authentication]



[ OpenLDAP Software 2.3 Administrator's Guide: Using TLS]



[OpenLDAP Server With Server-Side SSL/TLS and Client Authentication]



[OpenLDAP Faq-O-Matic: How do I use TLS/SSL?]



[旅舍依瑪-如何製作 SSL X.509 憑證?]



[小明網誌 | 為 openldap 加上 SSL 囉]



[使用 OpenLDAP 集中管理用户帐号]



[ SSL Certificates HOWTO]



[ 基於安全LDAP 伺服器之整合服務認證系統設計與實現]



[ FreeBSD下利用ACL/SSL安全使用OpenLDAP]



[針對 UNIX 的 Microsoft Windows 安全和目錄服務解決方案指南]


Me FAQ


Q1.加入 TLS 設定後 slapd 服務起不來?



Error Meaage:


當我在相關設定檔加入 TLS 選項後 slapd 服務卻起不來,查看 ldap.log 如下


 Jul 18 18:14:28 ldap slapd[52830]: @(#) $OpenLDAP: slapd 2.3.24 (Jul 13 2006 17:08:02)
Jul 18 18:14:58 ldap slapd[52830]: connections_destroy: nothing to destroy. //連接毀壞
Jul 18 18:14:58 ldap slapd[52830]: main: TLS init def ctx failed: -1 //TLS 失敗
Jul 18 18:14:58 ldap slapd[52830]: slapd stopped. //服務停止


Ans:


原因在於我產生的 LDAP 伺服器用的 Private Key (ldap.weithenn.org.key) 其檔案的擁有人 (owner) 是 root 不是 ldap 造成 slapd 服務無法讀取該檔案,因而造成啟動失敗


 #chown ldap ldap.weithenn.org.key

將檔案擁有人 (owner) 修改為 ldap 後再次重新啟動 slapd 服務可以從 ldap.log 看到正常啟動了,訊息如下


 Jul 19 09:52:40 ldap slapd[55582]: slapd starting

Q2.加入 TLS 設定後 id 及 finger 指令無法查詢 LDAP Account?



Error Meaage:


當我在相關設定檔加入 TLS 選項後,使用id 及 finger 指令都查詢不到 LDAP Account 似乎 pam_ldap/nss_ldap 沒作用一般



Ans:


此次原因就是未把 OpenLDAP Client 設定檔內 uri ldap://FQDN 填入 (我填的是機器的 IP),因此記得把 uri ldap:// 填入


 /usr/local/etc/openldap/ldap.conf
/usr/loca/etc/nss_ldap.conf


[RE: openldap tools starttls]


Q3.加入 TLS 設定後 /var/log/message 一直跳 nss_ldap 找不到 LDAP?



Error Meaage:


當我在相關設定檔加入 TLS 選項後,當 nss_ldap 定期 (大約五分鐘) 去找 LDAP 時在 /var/log/ldap.log 不會出現錯誤訊息,但 /var/log/message 卻一直出現訊息說找不到 LDAP Server


 Jul 26 02:22:00 ldap cron[83445]: nss_ldap: could not search LDAP server - Server is unavailable


Ans:


將原本 nss_ldap.conf 內的 HOST IP 改成機器的 IP 後, /var/log/message 便不會在出現這樣的訊息了


 #vi /usr/local/etc/nss_ldap.conf
HOST 127.0.0.1 //原設定值
HOST 192.168.10.9 //修改後







原文出處:不自量力 の Weithenn: OpenLDAP-SSL TLS 設定
前一個主題 | 下一個主題 | 頁首 | | |



Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|