SSL憑證導入

先簡單介紹一下SSL憑證

SSL 採用的是 X.509 ,由上而下的金字塔架構

在 X.509 中,每個合格的憑證上面,都會有簽名, 最下層的憑證上,有上層認證中心( CA ,註一)的數位簽名,表示這個憑證被上層 CA 檢查過. 同樣的,上層 CA 上面會有管轄他的最高層認證中心( root CA )的簽名. 而 root CA 因為沒有更高層的單位,所以憑證上面的簽名是自己簽的.

會用到 SSL 的程式,通常都會內含幾家 CA 的憑證,往後接到憑證後,會確認上面的簽名是不是已經有認得(也就是內含)的CA簽名.
1.如果有,那就表示這個憑證是合格的,開始接下來的加密傳輸動作
2.如果沒有,就會被認為是無效或不安全的憑證,會出現"憑證無效"的警告

Windows 已經內建幾個CA的憑證,所以一般使用是沒有問題的.
但是如果自己架設網站,想要開啟 SSL 功能呢??總不可能也花個好幾萬請 CA 幫你簽名,更不用說這還有使用期限.

下面介紹的就是如何建個屬於自己的憑證,讓往後各種功能都可以正常使用SSL
(環境使用 FreeBSD 4.x 內建的 OpenSSL , 且已在 FreeBSD 6.x/7.x 確認可行)

註一: Certificate Authority,Windows翻譯成"憑證授權",這邊指的是認證單位

1. 設定 OpenSSL

FreeBSD 內建的 OpenSSL 設定,放在 /etc/ssl

1-1. 設定各個相關目錄
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

1-2. 修改 openssl 設定
修改 /etc/ssl/openssl.cnf

把這一行
dir = ./demoCA # Where everything is kept

改成
dir = /etc/ssl # Where everything is kept



2. 製作 Root CA 的憑證

這個動作只需要作一次,往後都使用這個憑證就可以了,除非 Private key 外洩 / 檔案遺失 / 憑證過期,不然絕對不要重作 root CA 憑證
先假設我們要作的最高層認證中心叫做 kaienroid

2-1. 製作 Private key
記得設定 Private Key 的 password
openssl genrsa -des3 -out /etc/ssl/private/kaienroid.key.pem 4096
chmod og-rwx /etc/ssl/private/kaienroid.key.pem

2-2. 填寫憑證申請書
憑證申請書,是用來和 Private Key 交給一起認證中心以便審核並簽名用的.
填寫時會詢問一些資訊,照著提示填就好了,密碼不需要設.
openssl req -new -key /etc/ssl/private/kaienroid.key.pem -out /tmp/kaienroid.req.pem


2-3. 簽發憑證
前面已經提過,因為 root CA 沒有上層單位,所以只能自己簽
root CA 最好不要過期,一旦過期所有 root CA 簽名的憑證會通通失效,所有憑證得重新做過,非常麻煩
預設是30天,為保險起見, 有效期就簽 7300 天 (約 20 年)
openssl x509 -req -days 7300 -sha256 \
-extfile /etc/ssl/openssl.cnf -extensions v3_ca \
-signkey /etc/ssl/private/kaienroid.key.pem \
-in /tmp/kaienroid.req.pem -out /etc/ssl/certs/kaienroid.crt.pem

完成後記得砍掉憑證申請書,並建立hash索引
rm -f /tmp/myrootca.req.pem
rehash /etc/ssl/certs

這樣就好了
Private key 檔案在 /etc/ssl/private/kaienroid.key.pem ,小心保管,檔案讀取權限最好不要給第二個人有

簽好的Public Key 在 /etc/ssl/certs/kaienroid.crt.pem , 盡量散出去給其他人,往後所有 SSL 憑證都認這個
可能的話把這個 Public key 加到各程式內建的憑證列表裡,往後用這個簽名後的憑證就不會再顯示 "憑證無效"

3. 製作各種服務用的憑證

重點來了,所有往後用的憑證都是照這個程序製作
假設現在作的是 www.kaienroid.com 要用的憑證

3-1. 製作 Private key
這邊記得不要設密碼,不然每次 SSL伺服器 啟動的時候都會問密碼
openssl genrsa -out /etc/ssl/private/www.key.pem 1024
chmod og-rwx /etc/ssl/private/www.key.pem

3-2. 填寫憑證申請書
填寫資料時記得 Common Name 要用伺服器的 FQDN ( www.kaienroid.com ) ,不然一樣會被認為是不合格的憑證
openssl req -new -key /etc/ssl/private/www.key.pem -out /tmp/www.req.pem

3-3. 使用 root CA 簽發憑證
這邊一樣可以設定期限,這邊先設730天(2年),如果有需要(想省事一點設到更久也可以)
openssl x509 -req -days 730 -sha256 \
-extfile /etc/ssl/openssl.cnf -extensions v3_req \
-CA /etc/ssl/certs/kaienroid.crt.pem -CAkey /etc/ssl/private/kaienroid.key.pem \
-CAserial /etc/ssl/kaienroid.srl -CAcreateserial \
-in /tmp/www.req.pem -out /etc/ssl/certs/www.crt.pem

和之前一樣的, 刪除憑證申請書
rm -f /tmp/www.req.pem


這樣就好了
和之前一樣,把 Private key收好,往後遇到像 Apache 一類可以使用 SSL 的程式就設定這一組 Key pair (www.key.pem, www.crt.pem)

4. 各種常見服務的 SSL 設定(未完待續)

4-1. https ( apache )
apache 的 https 設定並不難, 只要照下面幾個步驟改完就可以用了

1. 開啟 httpd.conf 的 ssl plugin, 並且確定 Include 的檔案裡有 ssl.conf
2. 修改 ssl.conf, 把SSLEngine 設成 on
3. 把SSLCertificateFileSSLCertificateKeyFile 設成自己的 keypair (pem / key)
4. 重新啟動 Apache

但是, 因為 https 還沒辦法搞 name-based virtualhost, 所以搞 virtualhost 會遇到 host name 不符合 key 的內容, 會被認定為不合法的狀況.

這部份目前我還找不到解法, 或許往後版本的 Apache 可以把 name-based ssl 把這方面的問題解決掉??
原因是 https 預設會用 ip 反查結果的 host name 來比對 key pair 裡面的 host name, 所以 name-based virtualhost 應該是沒辦法用, 得用實體 ip 才行.

沒有留言:

張貼留言