基礎(chǔ)知識
在介紹證書鏈之前,需要首先了解一下非對稱加密以及電子證書相關(guān)的基礎(chǔ)概念节预。關(guān)于這部分仅财,我也一直有些困惑狈究,直到看了阮一峰老師的博客,才對證書有個比較清晰的認(rèn)知盏求。參考:http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html
看完阮老師的博客抖锥,一定對道格冒充鮑勃,然后將自己的公鑰發(fā)送給蘇珊那部分很困惑碎罚。后面就對這部分知識展開說一下磅废。
證書 & 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.
拯勉。可以這么說憔购,證書是用來認(rèn)證公鑰持有者的身份的電子文檔宫峦,防止第三方進行冒充。一個證書中包含了公鑰玫鸟、持有者信息导绷、證明證書內(nèi)容有效的簽名以及證書有效期,還有一些其他額外信息鞋邑。
CA
我們用證書來認(rèn)證公鑰持有者的身份诵次,那證書是怎么來的呢?又該怎么認(rèn)證證書呢枚碗?這涉及到一個稱之為PKI(Public key certificate)的規(guī)范體系逾一,包含了數(shù)字證書,公鑰管理以及驗證等技術(shù)肮雨,詳細可以參考:https://en.wikipedia.org/wiki/Public_key_certificate 遵堵,我們這里只是簡單介紹一下概念。在阮老師的文章中怨规,提到證書要由證書中心(Certificate authority陌宿,簡稱CA)簽發(fā)的,同樣參考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就是簽發(fā)電子證書的實體掰烟。
Signing & Verification
證書的簽發(fā)(Signing)和認(rèn)證(Verification)的過程:
這兩個過程也是基于公鑰與私鑰的爽蝴,簽發(fā)和認(rèn)證的過程跟傳輸信息過程中的加密解密過程非常類似沐批。簽名密文(Signature)是一個重要憑證,Signature與簽發(fā)人的公鑰一同傳輸蝎亚,可以避免中間人在獲取證書時對證書內(nèi)容的篡改九孩。參考:http://blog.torchz.net/security/2014/12/23/security-ca-chain-of-trust.html 。
簽發(fā)證書的步驟
:
- Signing階段发框,首先撰寫證書的元信息:簽發(fā)人(Issuer)躺彬、地址、簽發(fā)時間梅惯、過期失效等宪拥;當(dāng)然,這些信息中還包含證書持有者(owner)的基本信息个唧,例如owner的DN(DNS Name江解,即證書生效的域名),owner的公鑰等基本信息徙歼。
- 通過通用的Hash算法將信息摘要提取出來犁河;
- Hash摘要通過Issuer(CA)私鑰進行非對稱加密,生成一個簽名密文魄梯;
- 將簽名密文attach到文件證書上桨螺,使之變成一個簽名過的證書。
驗證證書的步驟
:
- Verification階段酿秸,瀏覽器獲得之前簽發(fā)的證書灭翔;
- 將其解壓后分別獲得“元數(shù)據(jù)”和“簽名密文”;
- 將同樣的Hash算法應(yīng)用到“元數(shù)據(jù)”獲取摘要辣苏;
- 將密文通過Issuer(CA)的公鑰(非對稱算法争群,私鑰加密印机,公鑰解密)解密獲得同樣的摘要值饲梭。
- 比對兩個摘要苛白,如果匹配,則說明這個證書是被CA驗證過合法證書退客,里面的公鑰等信息是可信的骏融。
在Verification階段,解密Signature獲得摘要需要通過簽發(fā)者(Issuer)
的公鑰萌狂,又該如何獲得這個公鑰档玻,同時確保這個公鑰是有效的呢?就是下面的證書鏈的內(nèi)容
證書鏈
實例
在Chrome上任意打開一個支持HTTPS的網(wǎng)站茫藏,例如 https://www.baidu.com/ 误趴,我們會發(fā)現(xiàn)在地址欄的左側(cè)有個綠色的小鎖,點擊這個小鎖务傲,然后就可以查看這個網(wǎng)站的證書信息冤留。打開baidu碧囊,查看證書信息如下:
我們繼續(xù)探究baidu使用的HTTPS證書,除了HTTPS使用的 baidu.com 證書纤怒,向上還有兩級證書,證書有3類:
- end-user :baidu.com 包含用來加密傳輸數(shù)據(jù)的公鑰的證書天通,是HTTPS中使用的證書
- intermediates:CA用來認(rèn)證公鑰持有者身份的證書泊窘,即確認(rèn)HTTPS使用的end-user證書是屬于baidu.com的證書。這類intermediates證書甚至可以有很多級像寒。
- root:用來認(rèn)證intermediates證書是合法證書的證書烘豹。
簡單來說,end-user證書上面幾級證書都是為了保證end-user證書未被篡改诺祸,保證是CA簽發(fā)的合法證書携悯,進而保證end-user證書中的公鑰未被篡改。
證書鏈
CA組織
除了end-user之外筷笨,證書被分為root Certificates和intermediates Certificates憔鬼。相應(yīng)地,CA也分了兩種類型:root CAs 和 intermediates CAs胃夏。首先轴或,CA的組織結(jié)構(gòu)是一個樹結(jié)構(gòu),一個root CAs下面包含多個intermediates CAs仰禀,而intermediates又可以包含多個intermediates CAs照雁。root CAs 和 intermediates CAs都可以頒發(fā)證書給用戶,頒發(fā)的證書分別是root Certificates和intermediates Certificates答恶,最終用戶用來認(rèn)證公鑰的證書則被稱為end-user Certificates饺蚊。
end-user certificates & intermediates certificates
我們使用end-user certificates來確保加密傳輸數(shù)據(jù)的公鑰(public key)不被篡改,而又如何確保end-user certificates的合法性呢悬嗓?這個認(rèn)證過程跟公鑰的認(rèn)證過程類似污呼,首先獲取頒布end-user certificates的CA的證書,然后驗證end-user certificates的signature烫扼。一般來說曙求,root CAs不會直接頒布end-user certificates的,而是授權(quán)給多個二級CA映企,而二級CA又可以授權(quán)給多個三級CA悟狱,這些中間的CA就是intermediates CAs,它們才會頒布end-user certificates堰氓。
但是intermediates certificates的可靠性又如何保證呢挤渐?這就是涉及到證書鏈,Certificate Chain 双絮,鏈?zhǔn)较蛏向炞C證書浴麻,直到Root Certificates得问,如下圖:
root certificates
那Root Certificates又是如何來的呢?根據(jù) https://support.dnsimple.com/articles/what-is-ssl-certificate-chain/ 這篇文章的說法软免,除了可以下載安裝之外宫纬,device(例如瀏覽器,操作系統(tǒng))都會內(nèi)置一些root certificates膏萧,稱之為trusted root certificates漓骚,https://support.apple.com/en-us/HT202858 ,在Apple的官網(wǎng)上可以看到這個列表榛泛,有各個操作版本直接內(nèi)置的Root Certificates蝌蹂。
最后一個問題,為什么需要證書鏈這么麻煩的流程曹锨?Root CA為什么不直接版本證書孤个,而是要搞那么多中間層級呢?找了一下沛简,godaddy官方給了一個答案齐鲤,為了確保root certificates的絕對安全性,https://sg.godaddy.com/en/help/what-is-an-intermediate-certificate-868 覆享,將根證書隔離地越嚴(yán)格越好佳遂。
其他
了解了這個證書體系之后,才明白為什么百度/google這種公司也需要向第三方購買簽名證書了撒顿,自簽root證書推廣起來非常困難丑罪,這也導(dǎo)致目前的證書市場基本上被 Symantec(VeriSign/GeoTrust) / Comodo / GoDaddy 壟斷。百度使用的是Versign凤壁,google使用的是GeoTrust吩屹。目前HTTPS的推廣已經(jīng)不可避免,也已經(jīng)有一些公益組織開始提供免費拧抖、自動化煤搜、開放的證書簽發(fā)服務(wù),例如:Let's Encrypt 唧席。詳細使用可以參考奇舞周刊的這篇文章擦盾,Let's Encrypt,免費好用的 HTTPS 證書 淌哟。
最后迹卢,對于Mac中各種各樣的證書,可以通過Keychain Access來管理查看徒仓。在Keychain Access對某個證書執(zhí)行Evaluate
腐碱,就能得到證書鏈信息,如下: