2016年11月27日 星期日

Certtool 簡化申請/產生 ssl 憑證流程 (哈利波特圖解版)

certtool 申請/產生 ssl 憑證流程 不論是想要把 http 升級成 (加密版的) https、 想要把 ldap 升級成 (加密版的) ldaps, 或是想要佈建 VPN (virtual private network, 虛擬私有網路), 都需要產生 ssl 憑證 (secure socket layer certificate)。 ssl 憑證的運作原理跟 ssh 一樣, 都是採用 非對稱式加解密 Asymmetric Cryptography 演算法。 不過一方面它比 ssh 信任機制 簡單, 因為它把公私鑰放在同一個檔案裡, 所以你不太需要了解原理也可以使用它; 另一方面它也比 ssh 麻煩很多, 因為需要找權威機構發憑證給你, 否則別人不會信任你。 以前我用 openssh 產生憑證, 超級麻煩, 完全搞不清楚自己在幹什麼。 最近發現 ssl 憑證恩物 gnu certtool, 指令變簡單很多。 再加上我這篇圖解, 未來的新手就幸福多了。

把每一張 ssl 憑證想成是一張巫師證書。 上面會有巫師的姓名特長等等個人資訊及巫師的簽章 (圖中每張證書的中間部分), 再加上校長的姓名特長等等個人資訊及校長的簽章 (圖中每張證書的右下角) 共四項重要資訊。

所謂 certificate authority (CA) 就是發證人/發證單位。 在上圖中, 以鄧不利多 (Albus Dumbledore) 來代表 CA。

先講 https 對外公開正式上線的場合。 此時你真的需要有一個 (通常要收錢的) CA 幫你簽章。 就像下方人在校外飛行的哈利波特, 他自己先填好證書並且簽章, 然後寄給鄧不利多。 圖的左下角那張 「學生自己填了一半的證書」 就是 certificate signing request (csr)。 鄧不利多簽好之後, 得到圖的右下角那張完整證書, 再寄回給哈利波特, 他就能把這張證書錶起來展示了。

但更多時候, 第一次學用 ssl 憑證的新手們並不需要公開展示他的證書, 他只是想要自己架設有加密的安全服務給自己人用。 這時不如就... 自己的證書自己發吧!

首先你要扮演鄧不利多校長。 但是要發證書給別人之前, 得先發一張證書給自己啊! 所以證書中間的巫師姓名特長及巫師簽章填自己; 證書右下角的校長姓名特長及校長簽章也填自己, 於是得到了圖的左上方那張證書。 然後你再拿一張空白證書, 在右下角校長欄填上自己的姓名特長、 在校長欄簽名。 但這張證書是要給學生的 (例如妙麗), 所以你順便同時在巫師欄裡幫她填上她的姓名特長。 最後我們小小犯規一下: 反正演來演去都是我自己一個人在唱獨角戲, 乾脆就幫妙麗簽名算了, 於是得到圖的右上方那張證書。

簽章所需要用到的 (公私鑰合併) 金鑰檔, 理論上應該由每個人各自私密保存。 也就是說, 在正常流程下 (例如鄧不利多幫哈利波特簽章的狀況) 校長不需要也不應該取得學生的金鑰。 上述的小小犯規把戲破壞了這個原則, 但也讓 certtool 變得比 openssl 簡單好用很多。

現在再來看指令就比較容易懂了: certtool 有三個主要的常用選項:

  1. certtool -s ... 自己的憑證自己發
  2. certtool -c ... 發憑證時順便代替學生簽名
  3. certtool -q ... 學生填寫空白憑證以便寄給校長簽名

另外還有以下幾個常用選項指定要讀取哪個檔案:

  1. --template 「學生姓名特長等等公開資訊」 的檔案
  2. --load-privatekey 「學生金鑰」 的私密檔案
  3. --load-ca-certificate 「校長姓名特長等等公開資訊」 的檔案
  4. --load-ca-privatekey 「校長金鑰」 的私密檔案

所以要下指令之前, 必須先把這些輸入檔準備好。 金鑰檔可以用另一個常用選項產生: certtool -p 產生後要記得 把它改成只有自己看得見! 至於 「姓名特長等等公開資訊」 檔案的填寫方式/範例, 請參考 创建openssl证书和CA的最简单的方法 ubuntu wiki。 以下是完整的指令示範; 其中的 *.key 檔對應到圖中的簽名; *.info 對應到圖中的相片; *.cert 跟 *.csr 對應到圖中的巫師證書。

certtool -p > CA.dumbledore.key
chmod 600 CA.dumbledore.key
certtool -s --load-privkey CA.dumbledore.key --template CA.dumbledore.info > CA.dumbledore.cert
certtool -i < CA.dumbledore.cert 

certtool -p > hermione.key
chmod 600 hermione.key
certtool -c --template hermione.info --load-privkey hermione.key --load-ca-certificate CA.dumbledore.cert --load-ca-privkey CA.dumbledore.key > hermione.cert
certtool -i < hermione.cert

certtool -p > harry.key
chmod 600 harry.key
certtool -q --load-privkey harry.key --template harry.info > harry.csr
# 哈利波特(用e-mail之類的)把 harry.csr 寄給鄧不利多校長
openssl x509 -req -in harry.csr -CA CA.dumbledore.cert -CAkey CA.dumbledore.key -CAcreateserial > harry.cert
# 鄧不利多校長做完上面指令後,再把 harry.cert 寄回給哈利波特

特別提醒: 你的 *.key 要放到安全的地方保存好, 既不能被別人看見, 又要有備份以防遺失。

最後談一下 「正規不犯規」 的簽章方式。 鄧不利多校長該如何用正確的方式幫哈利波特簽章呢? 搜尋不到 certtool 的解決方案; 但找到 這個問答: 「(跟 openssl 的其他選項比起來) 大部分時候採用 x509 簡單多了。」 我沒認真研究這個 openssl 指令; 不過用 vimdiff 比較它所產生的憑證檔跟 certtool 所產生的憑證檔, 看起來格式好像類似。

certtool 這類工具以及貴哥的這類圖解文章對於降低門檻、資訊技能平民化有很大的貢獻, 應該被頒個什麼獎之類的才對啊 :-)

ps. 圖中的簽名圖樣是從 Signature Fonts 這個網頁產生出來的。

4 則留言:

  1. 回覆
    1. 還是不夠清楚對一般資訊程度使用者

      刪除
    2. 這工具也只是用來解析且產生X.509 憑證, 請求及私鍵
      流程google一下即可

      刪除
    3. https://nx3d.org/tls/

      刪除