【前言】最近看過幾篇文章,內容是關於「全民HTTPS」的。爲何HTTPS,忽然會受到如此多業內人士的青睞呢?HTTPS到底是什麼呢?它與HTTP又有怎樣的區別呢?算法
帶着這個問題,我查看了不少網上的資料,可是太多的專業詞彙,讓我感到頭疼,很難理解。按我我的的認知,這個世界上根本不存在任何高深的道理,尤爲是西方講究科學性的思惟,再高深,也不可能高深過中國傳統思想中的八個字「只可意會,不可言傳」,徹底不應訴你,讓你本身去領悟,這多難啊。瀏覽器
因此,我又耐着性子,參照翟志軍的《也許,這樣理解HTTPS更容易》一文,以及百度詞條的相關定義,用類比的方法,追根溯源,從新梳理一下,才恍然大悟。本着分享的精神,我就把本身所感所悟的過程記錄下來,但願你們讀罷此文,也能有所感悟!安全
【思考一:爲何HTTPS會忽然受到青睞?】服務器
答案就四個字——HTTP劫持!網絡
【思考二:什麼是HTTP劫持?】數據結構
官方解釋:什麼是HTTP劫持呢,大多數狀況是運營商HTTP劫持,當咱們使用HTTP請求請求一個網站頁面的時候,網絡運營商會在正常的數據流中插入精心設計的網絡數據報文,讓客戶端(一般是瀏覽器)展現「錯誤」的數據,一般是一些彈窗,宣傳性廣告或者直接顯示某網站的內容。網站
通俗解釋:你預約了某類軍事雜誌(類比「客戶端向服務器發送了一條請求,訪問軍事網站」),此時黑心快遞員(類比「不要臉的運行商或黑客」)拆封了你的快遞(類比「劫持了你的正常數據流」),而後在軍事雜誌的每一頁,都貼上了「包小姐」的小廣告(類比「精心設計的網絡數據報文」),再送行打包送給你,得到額外盈利。加密
【引伸:什麼是DNS劫持?】spa
官方解釋:DNS劫持就是經過劫持了DNS服務器,經過某些手段取得某域名的解析記錄控制權,進而修改此域名的解析結果,致使對該域名的訪問由原IP地址轉入到修改後的指定IP,其結果就是對特定的網址不能訪問或訪問的是假網址,從而實現竊取資料或者破壞原有正常服務或詐騙錢財的目的。操作系統
通俗解釋:高考填報考時,你在志願書上填寫了「北大」(類比「正常請求」),可是你的前任偷走了你的志願書(類比「劫持了DNS服務器」),把他改爲了「北大某鳥」。最後的結果就是,你以690分的成績考入了北大某鳥(類比「最終訪問了假網址」),而後還假裝北大招生辦,讓你往某銀行卡打入5千元學費(類比「後續詐騙錢財」)。
【一句話歸納:HTTP劫持與DNS劫持的區別?】
HTTP劫持:你打開的是人民日報的官方網站,右下角卻彈出了藍翔的挖掘機廣告。
DNS劫持:你在地址欄輸入的是人民日報的網頁地址,卻打開了淘寶特賣的釣魚網站。
【思考三:HTTP爲何會被劫持?】
一句話:HTTP在傳輸的過程當中使用的是明文!
通俗解釋:你在快遞東西的時候,快遞員是能夠看到你的物品的,這樣,他就能夠隨意更換篡改你的東西。
【思考四:如何避免HTTP明文的不良影響呢?(推演HTTPS協議的前世此生)】
1.最早想到的就是對明文進行加密,好比各類對稱加密(DES);
安全成立的條件:S足夠安全,且只有A和B知道;
可是這樣就能夠了嗎?——遠沒想象那麼簡單!
若是服務器端B對全部的客戶端通訊A都使用一樣的對稱加密算法S,那麼,這是否是就能夠輕易破解,也就無異於沒有加密了呢?
2.如何即能使用對稱加密算法,又不公開密鑰?
答:Web服務器與每一個客戶端使用不一樣的對稱加密算法:
3.服務器端B怎麼告訴客戶端A該使用哪一種對稱加密算法S呢?
答:經過協商。
可是,這樣就安全了嗎?——依然沒有,由於這個協商過程,自己又是裸露的,依然能夠被獲知,那麼怎麼辦呢?
有人說繼續對「協商內容」進行加密,那麼,此時你有沒有發現,已經陷入一個死循環了呢?
4.如何解決這種對稱加密的死循環呢?
答:用非對稱加密(經常使用RSA)。
5.什麼是非對稱加密?
官方解釋:對稱加密算法在加密和解密時使用的是同一個祕鑰;而非對稱加密算法須要兩個密鑰來進行加密和解密,這兩個祕鑰是公開密鑰(public key,簡稱公鑰)和私有密鑰(private key,簡稱私鑰)。
通俗解釋:政府的財政收入(類比「私鑰加密後的密文」),只要是公民,都有權知道(類比「只要是公鑰,均可以解密」);可是公民我的的收入(類比「公鑰加密後的密文」),除了本身,只有政府才能夠知道,其餘人不行(類比「只有私鑰能夠解密」)。中國政府只有一個,但公民是有不少的(類比「私鑰只有一我的有,而公鑰能夠發給全部的人」)。
此時你應該明白了:HTTPS同時須要對稱加密算法和非對稱加密算法。
6.要達到Web服務器針對每一個客戶端使用不一樣的對稱加密算法,同時,咱們也不能讓第三者知道這個對稱加密算法是什麼,怎麼辦?
答:使用隨機數。就是使用隨機數來生成對稱加密算法。這樣就能夠作到服務器和客戶端每次交互都是新的加密算法、只有在交互的那一該才肯定加密算法。
此時,你明白爲何HTTPS協議握手階段會有這麼多的隨機數了吧。
7.如何讓客戶端安全地獲得公鑰呢?
答:兩種假設:
①讓服務器端將公鑰放到一個遠程服務器,客戶端能夠請求獲得;
②讓服務器端將公鑰發送給每個客戶端;
先看假設①,將公鑰放到一個遠程服務器,客戶端又須要發送請求才能獲得。注意,一旦有請求,又有明文,又回到那個死循環了。顯然不能夠!
再看假設②,仍然有一個問題:若是服務器端發送公鑰給客戶端時,被中間人調包了,怎麼辦?顯然不能夠!
爲了方便能理解,請看下圖:
8.如何解決公鑰被調包的隱患呢?
公鑰被調包的問題出現,是由於咱們的客戶端沒法分辨返回公鑰的人究竟是中間人,仍是真的服務器。這其實就是密碼學中提的身份驗證問題。
問題的關鍵在於:咱們選擇直接將公鑰傳遞給客戶端的方案,咱們始終沒法解決公鑰傳遞被中間人調包的問題。
因此,咱們不能直接將服務器的公鑰傳遞給客戶端,而是第三方機構使用它的私鑰對咱們的公鑰進行加密後,再傳給客戶端。客戶端再使用第三方機構的公鑰進行解密,這樣就引出了數字證書的概念。
9.什麼是數字證書?
官方解釋:數字證書是一個經證書受權中心數字簽名的包含公開密鑰擁有者信息以及公開密鑰的文件。最簡單的證書包含一個公開密鑰、名稱以及證書受權中心的數字簽名。數字證書還有一個重要的特徵就是只在特定的時間段內有效。數字證書是一種權威性的電子文檔,能夠由權威公正的第三方機構,即CA(例如中國各地方的CA公司)中心簽發的證書,也能夠由企業級CA系統進行簽發。
說明:證書中只有服務器交給第三方機構的公鑰,並且這個公鑰被第三方機構的私鑰加密了。若是能解密,就說明這個公鑰沒有被中間人調包。由於若是中間人使用本身的私鑰加密後的東西傳給客戶端,客戶端是沒法使用第三方的公鑰進行解密的。
可是第三方機構不可能只給你一家公司製做證書,它也可能會給中間人這樣有壞心思的公司發放證書。這樣的,中間人就有機會對你的證書進行調包,客戶端在這種狀況下是沒法分辨出是接收的是你的證書,仍是中間人的。由於不論中間人,仍是你的證書,都能使用第三方機構的公鑰進行解密。
這樣,又出現了不安全因素,像下面這樣:
10.如何解決同一機構頒發的不一樣證書被篡改的問題呢?
要解決這個問題,咱們首先要想清楚11和12這兩個問題:
11.誰來負責辨別同一機構下不一樣證書呢?
答:客戶端。客戶端在拿到證書後,本身就有能力分辨證書是否被篡改了。
12.如何才能擁有分辨證書是否被篡改的能力呢?
答:使用數字證書。咱們從現實中找靈感。好比你是HR,你手上拿到候選人的學歷證書,證書上寫了持證人,頒發機構,頒發時間等等,同時證書上,還寫有一個最重要的:證書編號!咱們怎麼鑑別這張證書是的真僞呢?只要拿着這個證書編號上相關機構去查,若是證書上的持證人與現實的這個候選人一致,同時證書編號也能對應上,那麼就說明這個證書是真實的。
13.客戶端本地怎麼驗證證書呢?
讓證書自己寫上「如何根據證書的內容生成證書編號」。也就是:客戶端拿到證書後,根據證書上的方法本身生成一個證書編號,若是本身生成的證書編號與證書上的證書編號相同,那麼說明這個證書是真實的。同時,爲避免證書編號自己又被調包,因此使用第三方的私鑰進行加密。
這地方有些抽象,咱們來個圖幫助理解:
當客戶端拿到證書後,開始對證書中的內容進行驗證,若是客戶端計算出來的證書編號與證書中的證書編號相同,則驗證經過。
14.這麼多機器,第三方機構的公鑰怎麼跑到了客戶端的機器中呢?
其實呢,現實中,瀏覽器和操做系統都會維護一個權威的第三方機構列表(包括它們的公鑰)。由於客戶端接收到的證書中會寫有頒發機構,客戶端就根據這個頒發機構的值在本地找相應的公鑰。
【類比總結】
上邊例子中:
所提到的證書,其實就是HTTPS中的數字證書;
所提到的證書編號就是HTTPS中的數字簽名;
所提到的第三方機構就是指數字證書籤發機構(CA)。
【一句話總結HTTPS的原理】
HTTPS要使客戶端與服務器端的通訊過程獲得安全保證,必須使用的對稱加密算法,可是協商對稱加密算法的過程,須要使用非對稱加密算法來保證安全,然而直接使用非對稱加密的過程自己也不安全,會有中間人篡改公鑰的可能性,因此客戶端與服務器不直接使用公鑰,而是使用數字證書籤發機構(CA)頒發的證書來保證非對稱加密過程自己的安全,爲了保證證書不被篡改,引入數字簽名,客戶端使用相同的對稱加密算法,來驗證證書的真實性,如此,最終解決了客戶端與服務器端之間的通訊安全問題。