客戶端認證https服務端證書過程詳解——證書鏈

基本概念

證書

首先,我們看看在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. (https://en.wikipedia.org/wiki/Certificate_authority) ,簡單來說,CA就是簽發電子證書的實體。

Signing & Verification

證書的簽發(Signing)和認證(Verification)的過程:
在這裏插入圖片描述
這兩個過程也是基於公鑰與私鑰的,簽發和認證的過程跟傳輸信息過程中的加密解密過程非常類似。簽名密文(Signature)是一個重要憑證,Signature與簽發人的公鑰一同傳輸,可以避免中間人在獲取證書時對證書內容的篡改。參考:http://blog.torchz.net/security/2014/12/23/security-ca-chain-of-trust.html 。

簽發證書的步驟:

  1. Signing階段,首先撰寫證書的元信息:簽發人(Issuer)、地址、簽發時間、過期失效等;當然,這些信息中還包含證書持有者(owner)的基本信息,例如owner的DN(DNS Name,即證書生效的域名),owner的公鑰等基本信息。
  2. 通過Issuer(CA)的證書指定的Hash算法將信息摘要提取出來;
  3. Hash摘要通過Issuer(CA)私鑰進行非對稱加密,生成一個簽名密文;
  4. 將簽名密文attach到文件證書上,使之變成一個簽名過的證書。

驗證證書的步驟:

  1. Verification階段,瀏覽器獲得之前簽發的證書;
  2. 將其解壓後分別獲得“元數據”和“簽名密文”;
  3. 將Issuer(CA)的證書指定的Hash算法應用到“元數據”獲取摘要A;
  4. 將"簽名密文"通過Issuer(CA)的公鑰解密獲得摘要B。
  5. 比對摘要A和摘要B,如果匹配,則說明這個證書是被CA驗證過合法證書,裏面的公鑰等信息是可信的。

在Verification階段,解密Signature獲得摘要需要通過簽發者(Issuer)的公鑰,又該如何獲得這個公鑰,同時確保這個公鑰是有效的呢?就是下面的證書鏈的內容

證書鏈

實例

在Chrome上任意打開一個支持HTTPS的網站,例如 https://www.baidu.com/ ,打開開發者工具,點開Security
在這裏插入圖片描述
點開證書路徑,查看證書信息如下:
在這裏插入圖片描述
我們繼續探究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。

在這裏插入圖片描述

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,如下圖:

在這裏插入圖片描述

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。windows系統查看方式可以看這篇文章:windows查看系統證書

最後一個問題,爲什麼需要證書鏈這麼麻煩的流程?Root CA爲什麼不直接頒發證書,而是要搞那麼多中間層級呢?找了一下,godaddy官方給了一個答案,爲了確保root certificates的絕對安全性。我們可以想想,如果根證書的私鑰泄露了,所有使用該證書認證的設備都將變得不安全,影響太大,所以通過intermediates certificates給網站頒發證書,假如某個intermediates certificates的私鑰泄露了,只會影響這一個intermediates 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章