如何製作 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. 觀念討論
    1. SSL/X.509 簡介
    2. 憑證無效的警告
    3. 資料?什麼資料?
    4. 所以 SSL 就安全了囉?
    5. 什麼是數位簽名?
    6. 什麼是憑證?
    7. 什麼是認證中心?
    8. 什麼是最高層認證中心?
    9. 如何填寫憑證申請書
    10. X.509 憑證制度的檢討
    11. 其她 SSL/X.509 憑證的做法
  9. 註釋
  10. 參考資料
  11. 後記

前言

版權所有 © 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.crtmyrootca.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 後自行重開機, 卻當在那媯民雿L敲密碼,開不了機,那就不好玩了。

# 製作 RSA Private Key
openssl genrsa -out /etc/ssl/private/myhost.key 2048
chmod og-rwx /etc/ssl/private/myhost.key

2. 填寫憑證申請書

憑證申請書,是把妳的資料,和這個 Public Key 夾在一起,以便認證中心 審核,簽上簽名用的。所以這個步驟,會問妳這個 Key 的相關資料,包括國家 、城市、單位名稱、部門名稱、憑證名稱、聯絡人的信箱,以及申請的效期等 等。這媥斻狾W稱 (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 上。最好不要 把檔案搬到別的地方。妳可以在設定檔堙A把憑證位置設定到這堙C 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 後自行重開機, 卻當在那媯民雿L敲密碼,開不了機,那就不好玩了。

# 製作 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.crtmyrootca.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 的相關資料,包括國家 、城市、單位名稱、部門名稱、憑證名稱、聯絡人的信箱,以及申請的效期等 等。這媥斻狾W稱 (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 ,會 回報給使用者程式,雙方按原來的方式繼續連線。這樣做的好處是,使用者程 式不用改設連接埠,可以自動切換,相容性高,也不用為了 SSL ,多開一個 TCP 埠。但 TLS 的缺點則是,就算 不做 SSL ,還可以退回原來的方式繼續連線,那 SSL 程式查核憑證簽名的工作,有做等於沒做。只有連線加密的 的優點而已,無法真正查證伺服器的身份。 SMTP 就是一個例子。

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

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

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

httpd -t

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

POP3

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

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 為了讓郵件伺服器間收發信時,彼此相容,所以用 TLS ,不另開 TCP 埠。

Sendmail

為讓郵件儘量流通,不要掉信, Sendmail 能加密就加密,不會查核對方的 憑證。更何況,在 TLS 下,查核對方的憑證,也沒什麼意義。

要設定 Sendmail 使用 SSL ,編譯 Sendmail 時,要在 devtools/Site/site.config.m4 檔,加入下列這幾行:

# STARTTLS - 加入 SSL/TLS 功能
APPENDDEF(`conf_sendmail_ENVDEF', `-DSTARTTLS')
APPENDDEF(`conf_sendmail_LIBS', `-lssl -lcrypto')

編譯、安裝:

# 編譯 Sendmail
./Build

# 安裝 Sendmail
make install

接下來要設定 Sendmail 的設定檔 /etc/mail/sendmail.cf 。如果妳是用 m4 來做設定檔,在 m4 檔 config.mc 中加入下 列幾行:

dnl Sendmail STARTTLS SSL/TLS 設定
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')

重做設定檔:

m4 m4/cf.m4 config.mc > config.cf
cp -f config.cf /etc/mail/sendmail.cf

然後重開 Sendmail 。這樣 Sendmail SMTP 就可以開始做 SSL/TLS 了。

不過設定還沒結束。

Sendmail 自 8.12.1 版以後,為加強安全性,將伺服器和使用者程式分開 。伺服器程式因為要跑在低於 1024 的 SMTP(25) 埠,還是要由 root 來啟動,以 root 的權限來執行。使用者程 式則不再 setuid root ,改成 setgid smmsp , 用 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 內容] )的視窗。在 [內容] 那一頁 堙A中間有一區 [憑證] ,堶惘酗@個 [憑證(C)...] 的按鈕。按一下那個按鈕,會打開一個視窗,標 題是 [憑證] 。這奡N是 MS-WINDOWS 管理憑證的地方。[17]

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

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

設定瀏覽器

Mozilla 與 Netscape 6 以後的版本

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

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

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

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

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 外送郵件伺服器設定] 。右邊中間有一個 [使用 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)] 的選項上打勾。然後按 [確定][關閉] 。這樣就會用 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)] 的選項上打勾。然後按 [確定][關閉] 。這樣就會用 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)] 的選項上打勾。然後按 [確定][結束] 。這樣就會用 SSL 寄信了。

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

Eudora 5.1 以後的版本

Eudora 的 SSL 設計不是很好。

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

收信的時候, Eudora 會用 STARTTLS 試探看能不能用 SSL 收信,如果可以的話就切換成 SSL ,不然就 繼續用普通的 POP3 收信,所以不用特別設定收信的方式。不過 這樣反而會造成困擾:如果切換成 SSL 以後, Eudora 卻查不 到對方的憑證,反而會演變成憑證無效,停止收信。這時候,原本 POP3 正常收的信,伺服器加上 SSL 後, Eudora 突然不能收信,會造成使用者很大的困擾。這是 Eudora 另一個不良的設計。

請注意: OpenSSL 預設是做 PEM 格式的憑證,所以先前我 們做的都是 PEM 格式的憑證。但 Eudora 只能匯入 DER 憑證格式。 PEM 只是把 DER 用 Base64 編碼,以方便在網路上傳送,放在網頁上或用 E-mail 寄。我們可 以用 OpenSSL 把 PEMDER

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

要設定使用 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 Manger] 按鈕,會再跳出一個 [Certificate Infomation Manger] 的視窗。按一下右下角的 [Import Certificate] ,找到我們的最高層認證中心的 DERmyrootca-der.crt ,按 [開啟] , 就會加進去了。[22]

Becky!

Becky! 目前不支援 SSL

Opera 郵件

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

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

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

觀念討論

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 憑證不是偽造的, 但不能保證這家公司本身沒有問題。就算這家公司本身沒有問題,也不能保證 這家公司內部會不會成為別人入侵、竊取資料的目標。

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

就像在實體世界,跟不認識的商店買東西時,一定會保持戒心一樣,在網路 上和任何網站交易,也一定要保持戒心,除了要考慮妳平常信不信任這個網站 外,也要考慮妳傳過去的資料重不重要。舉例來說,留言板、討論區、網路投 票等等,不是很私人的資料,可以放心傳過去沒問題;但如果是真實姓名、手 機號碼、家媢q話、信用卡號碼, 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 的一環。v也是 認證中心 (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 ,堶探N會有印度蛇油的 Private Key ,就可以用印度蛇油 的名義來簽憑證,自稱為某某公司。印度蛇油的可靠度是零,絕對不要加進程 式中。(所以才叫做印度蛇油 Snake Oil ,騙人的。)

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

exit

註釋

  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 /tmp/dsaparam
    chmod og-rwx /etc/ssl/private/myrootca.key
    
    # 刪除 DSA 參數檔
    rm -f /tmp/dsaparam
    
    因為 DSA 取亂數參數要取很久,所以 OpenSSL 不直接做 DSA Key ,而把取出來的 DSA 參數存檔,再用參 數檔來做 DSA Key ,做下一組 Key 時就可以用同一個參數檔, 以節省時間。不過這塈畯怚u做一組 Key ,所以參數檔用過就可以刪了。 (回正文)
  8. 若妳的最高層認證中心,放在另一臺伺服器上,請將 /tmp/myhost.req 複製到那臺伺服器上的 /tmp/myhost.req ,登入那臺伺服器上,再繼續進 行。 (回正文:root/使用者)
  9. 如果妳原來是在另一臺伺服器做這組 Public/Private Key 的,把 /etc/ssl/certs/myhost.crt 複製到原來的 伺服器上的 /etc/ssl/certs/myhost.crt ,就可以 用了。記得要回到原來的伺服器上,把原來伺服器上的憑證申請書 /tmp/myhost.req 也刪掉。
    rm -f /tmp/myhost.req
    
    (回正文)
  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 ~/tmp/dsaparam
    chmod og-rwx ~/etc/ssl/private/myrootca.key
    
    # 刪除 DSA 參數檔
    rm -f ~/tmp/dsaparam
    
    因為 DSA 取亂數參數要取很久,所以 OpenSSL 不直接做 DSA Key ,而把取出來的 DSA 參數存檔,再用參 數檔來做 DSA Key ,做下一組 Key 時就可以用同一個參數檔, 以節省時間。不過這塈畯怚u做一組 Key ,所以參數檔用過就可以刪了。 (回正文)
  15. 若妳的最高層認證中心,是由 root 管理, 請接到 root 的第三步驟(回正文)
  16. 如果妳原來是在另一臺伺服器做這組 Public/Private Key 的,把 ~/etc/ssl/certs/myhost.crt 複製到原來 的伺服器上的 ~/etc/ssl/certs/myhost.crt,就可 以用了。記得要回到原來的伺服器上,把原來伺服器上的憑證申請書 /tmp/myhost.req 也刪掉。
    rm -f /tmp/myhost.req
    
    (回正文)
  17. 這 MS-WINDOWS 把「最高層認證中心 (Root CA) 」譯成「根目錄憑證授權」,把「認證中心 (CA) 」譯成「憑證授權」或「中繼憑證授權」,都是逐字翻譯 的結果,完全不知所云,翻譯之大忌,戒之。(回正文)
  18. 到 Mozilla 1.1 版為止, Mozilla 把「憑證 (Certificate) 」譯成「認證」,把「認證中心 (CA) 」譯成「 查證」,也是有問題的譯法,且不符目前的通譯。我已跟 Mozilla 中文化的作 者林弘德反映過這個問題,他承諾於 1.0.1 版後修正。(回正文)
  19. 實際儲存的地方,在 Mozilla 使用者設定檔目錄下的 cert7.db ,格式是 Berkeley DB 。(回正文)
  20. 我還沒找到直接開啟 [Certificate Infomation Manager] 的方法。如果有人知道,煩請告訴我。 (回正文)
  21. 實際儲存的地方,公用的認證中心在 Eudora 程式目錄下 的 rootcerts.p7b ,個人的認證中心在 Eudora 信箱目錄下的 usercerts.p7b ,格式是標準憑證格式 DER 的 PKCS#7 檔。(回正文)
  22. 要先失敗一次,才能去設定,其實挺蠢的。另一個「比較 不那麼愚蠢的方法」,就是直接去改 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 >> 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 自 己去維護。(回正文)

參考資料

  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: http://www.pathname.com/fhs/
  6. TLS 1.0: RFC 2246
  7. Apache: http://www.apache.org/, Apache-SSL, mod_ssl
  8. Qpopper: http://www.eudora.com/qpopper/

後記

2002-09-14

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

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

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

依瑪貓 <imacat@mail.imacat.idv.tw> 初稿 2002-01-09 ,上次更新日期 2002-09-14