證書鏈-Digital Certificates
基礎知識
在介紹證書鏈之前,需要首先了解一下非對稱加密以及電子證書相關的基礎概念。關於這部分,我也一直有些困惑,直到看了阮一峰老師的部落格,才對證書有個比較清晰的認知。參考:http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html
看完阮老師的部落格,一定對道格冒充鮑勃,然後將自己的公鑰傳送給蘇珊那部分很困惑。後面就對這部分知識展開說一下。
證書 & CA
證書
首先,我們看看在wikipedia上對證書的定義,In cryptography, a public key certificate (also known as a digital certificate or identity certificate) is an electronic document used to prove ownership of a public key.
CA
我們用證書來認證公鑰持有者的身份,那證書是怎麼來的呢?又該怎麼認證證書呢?這涉及到一個稱之為PKI(Public key certificate)的規範體系,包含了數字證書,公鑰管理以及驗證等技術,詳細可以參考:https://en.wikipedia.org/wiki/Public_key_certificate ,我們這裡只是簡單介紹一下概念。在阮老師的文章中,提到證書要由證書中心(Certificate authority,簡稱CA)簽發的,同樣參考Wikipedia上的概念,In cryptography, a certificate authority or certification authority (CA) is an entity that issues digital certificates. (
Signing & Verification
證書的簽發(Signing)和認證(Verification)的過程:
DF5C6075-E8BE-4E8E-99A5-97C9ADC8C7B7.png
這兩個過程也是基於公鑰與私鑰的,簽發和認證的過程跟傳輸資訊過程中的加密解密過程非常類似。簽名密文(Signature)是一個重要憑證,Signature與簽發人的公鑰一同傳輸,可以避免中間人在獲取證書時對證書內容的篡改。參考:http://blog.torchz.net/security/2014/12/23/security-ca-chain-of-trust.html
簽發證書的步驟
:
- Signing階段,首先撰寫證書的元資訊:簽發人(Issuer)、地址、簽發時間、過期失效等;當然,這些資訊中還包含證書持有者(owner)的基本資訊,例如owner的DN(DNS Name,即證書生效的域名),owner的公鑰等基本資訊。
- 通過通用的Hash演算法將資訊摘要提取出來;
- Hash摘要通過Issuer(CA)私鑰進行非對稱加密,生成一個簽名密文;
- 將簽名密文attach到檔案證書上,使之變成一個簽名過的證書。
驗證證書的步驟
:
- Verification階段,瀏覽器獲得之前簽發的證書;
- 將其解壓後分別獲得“元資料”和“簽名密文”;
- 將同樣的Hash演算法應用到“元資料”獲取摘要;
- 將密文通過Issuer(CA)的公鑰(非對稱演算法,私鑰加密,公鑰解密)解密獲得同樣的摘要值。
- 比對兩個摘要,如果匹配,則說明這個證書是被CA驗證過合法證書,裡面的公鑰等資訊是可信的。
在Verification階段,解密Signature獲得摘要需要通過簽發者(Issuer)
的公鑰,又該如何獲得這個公鑰,同時確保這個公鑰是有效的呢?就是下面的證書鏈的內容
證書鏈
例項
在Chrome上任意開啟一個支援HTTPS的網站,例如 https://www.baidu.com/ ,我們會發現在位址列的左側有個綠色的小鎖,點選這個小鎖,然後就可以檢視這個網站的證書資訊。開啟baidu,檢視證書資訊如下:
Screen Shot 2016-02-23 at 4.04.05 PM.png
我們繼續探究baidu使用的HTTPS證書,除了HTTPS使用的 baidu.com 證書,向上還有兩級證書,證書有3類:
- end-user :baidu.com 包含用來加密傳輸資料的公鑰的證書,是HTTPS中使用的證書
- intermediates:CA用來認證公鑰持有者身份的證書,即確認HTTPS使用的end-user證書是屬於baidu.com的證書。這類intermediates證書甚至可以有很多級。
- root:用來認證intermediates證書是合法證書的證書。
簡單來說,end-user證書上面幾級證書都是為了保證end-user證書未被篡改,保證是CA簽發的合法證書,進而保證end-user證書中的公鑰未被篡改。
證書鏈
CA組織
除了end-user之外,證書被分為root Certificates和intermediates Certificates。相應地,CA也分了兩種型別:root CAs 和 intermediates CAs。首先,CA的組織結構是一個樹結構,一個root CAs下面包含多個intermediates CAs,而intermediates又可以包含多個intermediates CAs。root CAs 和 intermediates CAs都可以頒發證書給使用者,頒發的證書分別是root Certificates和intermediates Certificates,終端使用者用來認證公鑰的證書則被稱為end-user Certificates。
Screen Shot 2016-05-06 at 6.15.06 PM.png
end-user certificates & intermediates certificates
我們使用end-user certificates來確保加密傳輸資料的公鑰(public key)不被篡改,而又如何確保end-user certificates的合法性呢?這個認證過程跟公鑰的認證過程類似,首先獲取頒佈end-user certificates的CA的證書,然後驗證end-user certificates的signature。一般來說,root CAs不會直接頒佈end-user certificates的,而是授權給多個二級CA,而二級CA又可以授權給多個三級CA,這些中間的CA就是intermediates CAs,它們才會頒佈end-user certificates。
但是intermediates certificates的可靠性又如何保證呢?這就是涉及到證書鏈,Certificate Chain ,鏈式向上驗證證書,直到Root Certificates,如下圖:
AF142477-662D-4314-89EF-FD0AF5D6C2F7.png
root certificates
那Root Certificates又是如何來的呢?根據 https://support.dnsimple.com/articles/what-is-ssl-certificate-chain/ 這篇文章的說法,除了可以下載安裝之外,device(例如瀏覽器,作業系統)都會內建一些root certificates,稱之為trusted root certificates,https://support.apple.com/en-us/HT202858 ,在Apple的官網上可以看到這個列表,有各個操作版本直接內建的Root Certificates。
最後一個問題,為什麼需要證書鏈這麼麻煩的流程?Root CA為什麼不直接版本證書,而是要搞那麼多中間層級呢?找了一下,godaddy官方給了一個答案,為了確保root certificates的絕對安全性,https://sg.godaddy.com/en/help/what-is-an-intermediate-certificate-868 ,將根證書隔離地越嚴格越好。
其他
瞭解了這個證書體系之後,才明白為什麼百度/google這種公司也需要向第三方購買簽名證書了,自籤root證書推廣起來非常困難,這也導致目前的證書市場基本上被 Symantec(VeriSign/GeoTrust) / Comodo / GoDaddy 壟斷。百度使用的是Versign,google使用的是GeoTrust。目前HTTPS的推廣已經不可避免,也已經有一些公益組織開始提供免費、自動化、開放的證書籤發服務,例如:Let's Encrypt 。詳細使用可以參考奇舞週刊的這篇文章,Let's Encrypt,免費好用的 HTTPS 證書 。
最後,對於Mac中各種各樣的證書,可以通過Keychain Access來管理檢視。在Keychain Access對某個證書執行Evaluate
,就能得到證書鏈資訊,如下:
Screen Shot 2016-05-06 at 5.16.02 PM.png
作者:李富強Jason
連結:https://www.jianshu.com/p/46e48bc517d0
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。