開局一張圖,內容全靠編(手動狗頭.jpg)。本文不打算長篇大論去講解各類HTTPS相關的理論知識,只是綜合網上各位大佬們的HTTPS詳解,做一個簡短的要點總結。水平有限,若有疏漏之處歡迎指正。算法
HTTPS = HTTP + SSL/TLS,是HTTP協議的安全版。瀏覽器
SSL的全稱是Secure Sockets Layer,即安全套接層協議,是爲網絡通訊提供安全及數據完整性的一種安全協議。SSL最新的版本是3.0。安全
TLS的全稱是Transport Layer Security,即安全傳輸層協議,是創建在SSL 3.0協議規範之上,是SSL 3.0的後續版本。服務器
SSL/TLS = 非對稱加密(如RSA、ECC) + 對稱加密(如AES、DES) + 散列算法(如MD5)網絡
由於HTTP在「裸奔」(明文傳輸,不安全)。dom
①:通常【客戶端】首先發起請求,例如請求網站www.thinktxt.com/, 生成一個隨機數(RandomC),攜帶支持的TLS版本、加密算法等信息發送至【服務端】。網站
②:【服務端】收到請求,返回證書、一個隨機數(RandomS)、協商加密算法。加密
③:【客戶端】拿到證書後開始進行校驗,驗證其合法性。客戶端經過本地瀏覽器或操做系統內置的權威第三方認證機構的CA證書進行驗證,一個證書包含域名、證書編號、公鑰、有效期等信息,證書編號是在服務器管理員經過第三方證書機構申請證書的時候,第三方機構用他們的私鑰對證書編號進行加密存入證書,根據編號生成方法生成證書編號(證書自己攜帶了生成證書編號的方法),與CA證書公鑰解密得出的證書編號進行對比,驗證不經過或者證書過時等狀況就提示存在風險(瀏覽器的紅色警告),驗證經過則進行下一步。操作系統
④:【客戶端】生成一個隨機數(PreMaster Key),此時已經有第三個隨機數了,根據三個隨機數(RandomC、RandomS、PreMaster Key)按照雙方約定的算法生成用於後面會話的同一把的「會話密鑰」。cdn
⑤:【客戶端】將隨機數(PreMaster Key)經過公鑰加密後發送至【服務端】。
⑥:【服務端】收到密文後用私鑰進行解密,獲得隨機數(PreMaster Key),此時服務端也擁有了三個隨機數,根據三個隨機數按照事先約定的加密算法生成用於後面會話的同一把的「會話密鑰」。
⑦:【服務端】計算此前全部內容的握手消息hash值,並用「會話密鑰」加密後發送至客戶端用於驗證。
⑧:【客戶端】解密並計算握手消息的hash值,若是與服務端發來的hash一致,此時握手過程結束。
⑨:驗證經過後,開始正常的加密通訊。
證書由服務器管理員從第三方證書機構申請,知名的證書機構有:Symantec、GeoTrust、GMO GlobalSign等,須要錢的,也有一些免費或限免的,如Let's Encrypt、TrustAsia等。
向證書機構提交公鑰、組織信息、我的信息(域名)等信息並申請認證,申請證書不須要提供私鑰,確保私鑰永遠只能服務器掌握。
證書 = 公鑰 + 申請者與頒發者信息 + 數字簽名
數字簽名其實就是咱們上面爲了簡單理解所說的證書編號,主要是用來證實證書和發送方的真實性,解決報文可能遭篡改的問題。
上面咱們說到證書編號其實就是爲了防止證書被篡改,證書機構給證書生成的數字簽名。就比如你的畢業證書,爲了保證惟一性,教育局給你的畢業證書上編一個惟一的證書編號,而且蓋章。HR爲了驗證你的畢業證書真實性,能夠經過學信網輸入證書編號查詢驗真僞。
一個證書只有一個證書編號。證書裏面自帶了生成證書編號的方法,CA證書根據方法生成一個數字簽名,再去經過CA證書本身的公鑰去解密(頒發證書時證書機構會用本身的私鑰加密數字簽名)證書中的簽名密文獲得數字簽名,若是證書是真實有效的,這兩個數字簽名理論上就是一致的。
證書機構的CA證書內置在瀏覽器或操做系統中,也就是客戶端本地,稱之爲CA根證書。
CA證書若是放在遠程,那這又涉及到請求,又會有被中間人篡改的風險,因此瀏覽器內置了一些知名證書機構的CA根證書,客戶端根據頒發者信息去找到對應的CA證書進行驗證。