Https的前世今生

子路發表於2018-01-31

1、年前會議

馬上要過年了,公司業務上的需求也少了很多,這不,王小二他們召開了一場技術會議,盤點年前能幹點啥。

只見C哥寫了一份清單,其中一項是全站升級https。

C哥說:https是一種趨勢,但目前我們介面還是http的。appstore也一直要求使用https,從安全性以及appstore稽核的角度來看,我們年前得全站升級https。有誰自告奮勇嗎?

小二想了一下:我來做吧C哥,正好了解下https。

C哥:好,小二,那你接下來研究下https,然後有時間再給我們分享下。

小二:好的C哥,保證完成!

2、深藏不露張三胖

聽說小二要做https,運維張三胖走到小二身旁。

張三胖:小二,聽說你要做https?

小二:是啊,三胖哥,我們得全站升級https。你之前瞭解過嗎?

張三胖:哈哈,我還真瞭解過,升級https是個不錯的注意。

小二:三胖哥,那太好了,你有時間給我講講?我就不用花時間去查資料了。

張三胖:好,我現在正有時間,給你講講,也正好複習下。

小二:多謝三胖哥,今中午請你吃飯啊。

3、對稱加密不足夠

三胖:小二,假設你用http協議給你女朋友發一封私密訊息。這樣有沒有洩密的風險呢?

小二:當然有了,http協議是明文傳輸,傳輸資料過程中的任何第三方都可以截獲並篡改該明文。

三胖微微一笑:是的,我們畫幅圖表示下,你就知道資訊被篡改多尷尬了,哈哈。

image_1c53cjed6t3s3ji108819b81r4sa5.png-28.6kB

小二:啊?確實是,那這樣太尷尬了。我女朋友不打死我...

三胖:其實用https就可以規避。

三胖:小二,你瞭解對稱加密與非對稱加密嗎?

小二:瞭解一些。對稱加密就是加密與解密的祕鑰是相同的。而非對稱加密就是公鑰加密的內容,必須用私鑰才能解密,私鑰加密的內容,必須用公鑰才能解密。

三胖:小二瞭解的還挺多嘛,其實https就是利用了對稱加密與非對稱加密的特性。但你要注意,對稱加密的速度是非對稱加密速度的100倍左右。

小二:三胖哥我明白了,那你用剛才的例子給我講講https的原理吧。

三胖:好,就用剛才的例子。對稱加密速度很快,所以你跟你女朋友的資料傳輸最好用對稱加密。

小二:可以啊,那我跟我女朋友就先約定好一個祕鑰唄?

三胖:是的,我們再畫張圖表示你們的資料傳輸過程。

image_1c53d58gq1ri1tnotk91j071dcub2.png-46.8kB

小二:是啊,胖哥,這樣別人就沒法截獲我的資訊了。

三胖:對。並且因為對稱加解密的速度很快,對你們資料傳輸速度的影響微乎其微。但是,你怎麼跟你女朋友溝通協商祕鑰呢?

小二:這還不簡單,我直接網上告訴他就可以啊。

三胖:哈哈,不可以。你明文通過網路傳輸的祕鑰被人擷取了怎麼辦?

小二:啊?確實是,別人擷取祕鑰後又可以篡改我的資訊了。

三胖:這時候就需要用到我們的非對稱加密來協商你們對稱加密的祕鑰了。

4、非對稱加密解憂愁

image_1c53dev3118a91btb1c26m6m1o3ibf.png-26.1kB

三胖:小美生成自己的公鑰和私鑰,通訊之前,她告訴你她的公鑰就可以了,這個公鑰因為是公開的,所以可以隨意在網路中傳輸了。

小二:這樣啊,我明白了C哥。我得到小美的公鑰後,然後用小美的公鑰,對對稱加密的密碼進行非對稱加密後發給小美。小美再通過他的私鑰解密後,就獲取了我生成的對稱加密的密碼了。是不是?

image_1c53fp98maga1s40okg1v098r9bs.png-27.6kB

三胖:對,就是這樣的。但是還有一個頭疼的問題,你怎麼確保你得到的就是小美的公鑰呢?假設中間人給你截獲篡改了呢?

小二:嗯...這確實是個問題。中間人把他的公鑰發給我,這樣我就使用中間人的公鑰加密我們對稱加密的密碼了,然後中間人再用他的私鑰解密出我們對稱加密的密碼。這時候中間人已經擷取了小美的公鑰,然後再把我們對稱加密的密碼通過小美的公鑰加密後發給小美...太可怕了,我們對稱加密的祕鑰就這樣被竊取了。

三胖:其實抓包工具charles之所以能抓https的包,就是利用的你說的這個原理,一會我們再細說。那現在問題就變成了,你怎麼確保你得到的公鑰就是小美的。

小二:哎,真讓人頭疼...

三胖:你知道我們平時都有公證處吧?這個公證處是一個可信的結構,經他公證的東西,都是具有可信力度的。

小二:知道啊,前幾天還看新聞說一個老太把他在帝都的一套房產通過公證處公證給了一個沒有血緣關係的小夥。

三胖:那你想想,如果小美的公鑰經過公證後,是不是就能證明這個公鑰是小美的呢?

小二:當然能夠證明。只是網路中存在這樣的公證處嗎?

三胖:還真存在這樣的公證處,我們把網路中的公證處稱為CA吧。不得不佩服前輩們,他們把一些可信的CA的證書都預先存在我們的電腦裡了,證書包括CA的資訊和CA的公鑰。只要你電腦安裝了系統,就安裝了這些證書。來,你看看我電腦裡預設安裝的證書。

image_1c50cl34t71k13ke7651a2b84im.png-219kB

小二:哦哦,明白了,意思就說這些預設的CA證書是絕對可信的。

三胖:對,就是這個意思。所以,只要CA同時給小美頒發一個證書證明是小美就可以了。CA給小美頒發的證書中,含有小美的個人資訊以及小美的公鑰。同時,CA也會給小美頒發一個私鑰。

你先把小美想象成百度,我們先來看CA給百度頒發的證書。

image_1c53gega513991vgv64l14vfdv3c9.png-118.7kB

小二:也就是說,只要保證CA給小美頒發的證書能夠安全傳輸到我這裡來就可以了。

三胖:對,現在的問題就轉換成了。小美的證書如何能夠安全的傳輸到你這裡?其實,CA給小美頒發的證書中,包含【小美的資訊+公鑰】、以及數字簽名。 數字簽名的內容是:使用CA私鑰加密過的【小美的資訊+公鑰】的hash值。

image_1c52jnccmf5g183hbdeo7782143.png-45.6kB

小二:哦哦,我好像明白了。CA的證書包含CA的公鑰以及CA的一些資訊,並且CA的證書預設儲存在我的電腦裡了,那我就可以使用CA的公鑰進行解密操作,從而驗證小美的證書是否是正確的了。

三胖:對的。我們可以使用你電腦裡CA的公鑰解密小美證書裡的數字簽名,從而得到簽名的hash值。然後,你再用同樣的hash演算法對【小美的資訊+公鑰】進行hash計算。如果小美證書裡簽名的hash值與你自己計算出來的hash值一致,就說明這個證書確實是小美的,否則就不是小美的證書。

image_1c52ks5du47j1ogr1l5g2221kmv5j.png-79kB

小二:三胖哥,我算是明白了。https還真是麻煩,但也確實保護了我們的隱私。

三胖:對,有失必有得嘛!

小二:嗯嗯。我現在通過小美的證書安全的獲取了小美的公鑰。那我這兒隨機生成一個對稱加密的祕鑰,這個對稱加密的祕鑰再通過小美的公鑰加密後,就能安全的傳輸給小美了。

三胖:是,小美再用他的私鑰解密,就獲取了你們約定的對稱加密的密碼了。以後,你們就可以使用對稱加密來傳輸資料,暗送秋波了,哈哈~

小二:三胖哥真是太厲害了,從此再也不用擔心跟我女朋友聊天被惡搞了。

三胖:哈哈。你把你自己想成瀏覽器,把小美想成伺服器。這就是整個https的傳輸流程。

小二:明白了,我畫一下https在瀏覽器與伺服器之間的執行流程,三胖哥你看下對不對。

image_1c53h99r81cpl2fp142b1ir5sc6d3.png-65.3kB

三胖:不錯不錯,小二很厲害嘛,基本就是這個流程。

小二:沒有沒有,還得多謝三胖哥的指教啊,哈哈。

5、Charles抓取https包的原理

image_1c53j78831ffh1q829cboukbeqdg.png-133.7kB
三胖:小二,我們知道charles抓包工具能夠抓取https的包,你知道這是什麼原理嗎?

小二:這我還真不知道,按理說https是絕對安全的協議,內容不會被charles抓取啊。

三胖:你記不記得,使用charles抓https包的時候,需要在你手機上安裝charles證書並且信任該證書

小二:對對,是有這一步操作。

三胖:就是這一步操作,可以使Charles抓取你的https包。我給你畫個流程圖你就明白了。

image_1c53apjmvi601p3hq7u5jb6t9o.png-82kB

小二:原來是這樣,這不就是我剛才說的問題嘛。那麼就說明https不是安全的協議了?

三胖:不是的。因為你安裝並信任charles證書,是你自己主動的操作,也可以說是你自己主動洩密的結果。如果你不信任該charles證書,那麼資料就不會被傳輸,連線會被直接中斷。所以https還是安全的協議。

小二:我明白了,確實是這樣,多謝三胖哥。

Happy Done

https的原理明白了,接下來的事情自然就水到渠成了。

小二列出了接下來要做的事情: 1、向CA(公證處)申請自己網站的證書; 2、修改程式碼裡靜態資源的http連結為https連結; 3、修改ajax裡面的http連結為https連結; 4、將證書部署在nginx上; 5、自測完成。

按照這個列表,小二一步步的順利完成了。

最終,https上線完成,愜意的享受午後的陽光吧,happy done~


image_1c5582vev1mql1lrpbm3198i1pkop.png-127.1kB

相關文章