上一篇文章簡單描述了加密解密的演進歷史,若是對這部分不感興趣的小夥伴其實能夠跳過那篇文章,不過在講以前我仍是要先作一些知識點鋪墊工做,避免文中遇到這些名詞時沒頭緒。算法
加密主要是分紅對稱加密和非對稱加密,這裏會涉及到這些知識點:瀏覽器
講 HTTPS 以前咱們先來看看爲何 HTTP 不能知足咱們的需求,它都存在哪些問題?當咱們瞭解了它的缺點,咱們也就更容易理解,爲何 HTTPS 的通訊過程要像如今這樣設計了。安全
HTTP 通訊的四類問題:bash
那咱們可否利用已有知識解決這些問題呢?答案是基本上能夠,讓咱們來看看這些問題具體該如何解決:服務器
那既然咱們知道了 HTTP 的信息傳輸過程當中存在的這些問題,那咱們接下來就進入正題,看看 HTTPS 如何解決掉這些問題。網絡
瞭解通訊流程以前,還須要先對 HTTPS 簡單作個介紹,爲何 HTTPS 能夠保障安全,它和 HTTP 到底有什麼區別和聯繫?優化
其實 HTTPS = HTTP over SSL / TLS,這樣看的話,其實它和 HTTP 的區別就是在於多了 SSL / TLS,因此 HTTPS 的密鑰協商、傳遞、加密解密也確定都是由 SSL / TLS 完成的。至於 SSL 和 TLS 的區別實際上是 TLS 是 SSL 的升級版,一開始 HTTPS 剛出來的時候安全層是 SSL,後來協議標準化,就在 SSL 的基礎上進行優化修改而且將其更名爲 TLS。網站
本來 HTTP 的數據是會扔給 TCP 進行處理髮送的,而 HTTPS 中成了 HTTP 數據扔給 SSL / TLS 加密處理,而後在由 SSL / TLS 扔給 TCP,對方收到後也是 TCP 扔給 SSL / TLS 進行解密,最後扔給 HTTP。如今像是在這二者之間插入了一層,因此我通常也稱 SSL / TLS 爲安全層。加密
HTTP -> TCP(HTTP)
HTTP -> TLS -> TCP(HTTPS)
複製代碼
介紹完了什麼是 HTTPS 後,若是隻用一句話歸納它,其實 HTTPS 的本質就是用非對稱加密協商出一套對稱加密密鑰。而後數據的傳遞都是經過對稱加密去作。這樣既保障了安全又保障了效率。spa
保障效率是由於後續真正的數據傳輸實際上是經過對稱加密來完成的,相比之下,非對稱加密因爲涉及到到大量運算,執行起來比對稱加密要慢,而保障安全是由於對稱加密密鑰的傳輸是經過非對稱加密的方式解決掉的。
下面就來看看 HTTPS 的通訊流程吧。
先來看下面這張圖:
TLS 或 HTTP 下層都是 TCP,因此無論怎樣咱們都須要先經過 TCP 三次握手來創建鏈接,而後再在這個鏈接基礎上,進行 TLS 的握手。粗略的看話,我以爲 TLS 握手主要包括如下內容:
若是仔細來看的話,我建議看着下面這張圖:
那讓咱們再來詳細的展開如下這個 TLS 的握手流程:
這就是我理解的 HTTPS 的通訊流程了,不過剛纔上面還缺失了重要一環也是證書驗證的內容,下面來主要講講證書驗證。
回想一下咱們最開始提到的若是愛麗絲想要和鮑勃使用非對稱加密進行安全通訊的話,那就必須先讓愛麗絲拿到鮑勃的公鑰才行,有什麼辦法能夠拿到對方的公鑰嗎?
若是仔細想一想的話這兩種方式其實都有問題,前者若是中間人伊芙引導你訪問了錯誤的網站就會致使你拿到錯誤的公鑰,然後者伊芙可能在大家公鑰傳輸的過程當中對信息進行攔截和篡改,因此愛麗絲想要拿到正確的鮑勃的公鑰並不容易。
那這個問題有解決方案嗎?就是經過非對稱加密的簽名來處理,可是鑑於無法拿到正確的鮑勃的公鑰因此無法讓鮑勃進行簽名發送過來,這時就須要一個第三方權威機構,咱們都信任它,而它會用本身的私鑰對鮑勃的公鑰進行簽名,而後咱們只須要拿到這個第三方權威機構的公鑰進行驗籤便可。
回到實際場景中來,這個第三方機構,就是證書頒發機構,也被稱爲 CA(後面也都簡寫爲 CA),若是服務端想讓 CA 給它頒發證書(信用背書),就會把本身的公鑰和身份信息發給 CA,CA 驗證沒問題後,生成證書信息,而且 CA 會對證書信息作一個摘要算法,就像提取指紋信息同樣,而後會對計算出來的 Hash 值進行簽名,最後打包下發。
先來粗略看下證書裏面都會包含什麼信息:
那咱們該如何驗證簽名呢?
但你可能會問,這個過程好像只是驗證了給證書籤名時的 CA 私鑰和咱們拿到的 CA 公鑰是對的上的,那若是 CA 證書下發過程自己就問題怎麼辦呢? 我怎麼能確認給這個服務端背書的 CA 是否可信呢?
要回答這個問題其實並不難,就是讓那個 CA 在找別的更大的更可信的 CA 給他作信用背書,直到找到背後那幾個全球最大的 CA 機構,這些 CA 機構也被稱爲 root CA,這些 CA 就已是咱們無條件要相信的了,這就像你能夠不相信同事告訴你的公司消息,可是同事告訴你這個消息是組長告訴個人,你去問了組長仍是不相信,組長說這個是經理告訴個人,你去問了經理仍是不相信,經理說這個是老闆剛發的公司消息,最終你去問了老闆並確認了消息,這時這條信任鏈就已經完整構建起來了。
因此給服務端下發證書的 CA(簡稱 CA L),它的公鑰實際上是另外一個更大 CA(簡稱 CA H)用本身的私鑰給它簽名的,也就是 CA H 會根據 CA L 提供行公鑰和身份信息給它頒發證書,而後這樣遞歸下去,直到咱們剛剛說的 root CA。
因此驗證的順序也像圖中這樣,可能看圖更好理解,我要驗證服務端證書就去找給中介 CA 拿它的公鑰進行驗籤(由於服務端證書是中介 CA 下發的),而中介 CA 證書驗證又要去找 root CA 拿它的公鑰進行驗證(同理中介 CA 的證書是 root CA 下發的),那麼 root CA 的公鑰在哪裏呢?通常在操做系統裏面都會有各大 root CA 的信息,固然瀏覽器或者某些軟件(好比支付寶)裏也會有。這時我拿到了 root CA 的公鑰信息,而後對中介 CA 證書進行驗證(證書驗證過程上面已經講到了),驗證完成後拿到中介 CA 的公鑰再對服務端證書進行驗證,這樣若是都沒問題,就說明整條信任鏈是通的,而我也能夠放心拿服務端證書裏的公鑰和對方進行非對稱加密通訊了。
到這裏 HTTPS 的通訊流程也就說完了。
若是隻用一句話總結 HTTPS 就是它的本質是經過非對稱加密協商出一套對稱密鑰,然後續真正數據都是使用對稱加密進行通訊。
這裏面的最難搞懂的點可能就是爲何要有證書和證書驗證過程。
說多了都是淚,但願看到這裏以後 HTTPS 對你來講就不是什麼難理解的事情了。
以上內容參考了扔物線的 HenCoder Plus、極客時間的《趣談網絡協議》、《透視 HTTP 協議》、《全棧工程師修煉指南》及 HTTPS 相關維基百科。
尤爲是那兩張很全的 HTTPS 流程圖都是出自極客時間專欄,黑白的那種出自《趣談網絡協議》,而最後那張彩色的出自《透視 HTTP 協議》。
若是你以爲我寫不錯,那就經過點贊,點贊,還 tm 是點讚的方式給我反饋吧,感謝你的支持。