1、年前會議
馬上要過年了,公司業務上的需求也少了很多,這不,王小二他們召開了一場技術會議,盤點年前能干點啥。
只見C哥寫了一份清單,其中一項是全站升級https。
C哥說:https是一種趨勢,但目前我們接口還是http的。appstore也一直要求使用https,從安全性以及appstore審核的角度來看,我們年前得全站升級https。有誰自告奮勇嗎?
小二想了一下:我來做吧C哥,正好了解下https。
C哥:好,小二,那你接下來研究下https,然后有時間再給我們分享下。
小二:好的C哥,保證完成!
2、深藏不露張三胖
聽說小二要做https,運維張三胖走到小二身旁。
張三胖:小二,聽說你要做https?
小二:是啊,三胖哥,我們得全站升級https。你之前了解過嗎?
張三胖:哈哈,我還真了解過,升級https是個不錯的注意。
小二:三胖哥,那太好了,你有時間給我講講?我就不用花時間去查資料了。
張三胖:好,我現在正有時間,給你講講,也正好復習下。
小二:多謝三胖哥,今中午請你吃飯啊。
3、對稱加密不足夠
三胖:小二,假設你用http協議給你女朋友發一封私密消息。這樣有沒有泄密的風險呢?
小二:當然有了,http協議是明文傳輸,傳輸數據過程中的任何第三方都可以截獲并篡改該明文。
三胖微微一笑:是的,我們畫幅圖表示下,你就知道信息被篡改多尷尬了,哈哈。
小二:啊?確實是,那這樣太尷尬了。我女朋友不打死我...
三胖:其實用https就可以規避。
三胖:小二,你了解對稱加密與非對稱加密嗎?
小二:了解一些。對稱加密就是加密與解密的秘鑰是相同的。而非對稱加密就是公鑰加密的內容,必須用私鑰才能解密,私鑰加密的內容,必須用公鑰才能解密。
三胖:小二了解的還挺多嘛,其實https就是利用了對稱加密與非對稱加密的特性。但你要注意,對稱加密的速度是非對稱加密速度的100倍左右。
小二:三胖哥我明白了,那你用剛才的例子給我講講https的原理吧。
三胖:好,就用剛才的例子。對稱加密速度很快,所以你跟你女朋友的數據傳輸最好用對稱加密。
小二:可以啊,那我跟我女朋友就先約定好一個秘鑰唄?
三胖:是的,我們再畫張圖表示你們的數據傳輸過程。
小二:是啊,胖哥,這樣別人就沒法截獲我的信息了。
三胖:對。并且因為對稱加解密的速度很快,對你們數據傳輸速度的影響微乎其微。但是,你怎么跟你女朋友溝通協商秘鑰呢?
小二:這還不簡單,我直接網上告訴他就可以啊。
三胖:哈哈,不可以。你明文通過網絡傳輸的秘鑰被人截取了怎么辦?
小二:啊?確實是,別人截取秘鑰后又可以篡改我的信息了。
三胖:這時候就需要用到我們的非對稱加密來協商你們對稱加密的秘鑰了。
4、非對稱加密解憂愁
三胖:小美生成自己的公鑰和私鑰,通信之前,她告訴你她的公鑰就可以了,這個公鑰因為是公開的,所以可以隨意在網絡中傳輸了。
小二:這樣啊,我明白了C哥。我得到小美的公鑰后,然后用小美的公鑰,對對稱加密的密碼進行非對稱加密后發給小美。小美再通過他的私鑰解密后,就獲取了我生成的對稱加密的密碼了。是不是?
三胖:對,就是這樣的。但是還有一個頭疼的問題,你怎么確保你得到的就是小美的公鑰呢?假設中間人給你截獲篡改了呢?
小二:嗯...這確實是個問題。中間人把他的公鑰發給我,這樣我就使用中間人的公鑰加密我們對稱加密的密碼了,然后中間人再用他的私鑰解密出我們對稱加密的密碼。這時候中間人已經截取了小美的公鑰,然后再把我們對稱加密的密碼通過小美的公鑰加密后發給小美...太可怕了,我們對稱加密的秘鑰就這樣被竊取了。
三胖:其實抓包工具charles之所以能抓https的包,就是利用的你說的這個原理,一會我們再細說。那現在問題就變成了,你怎么確保你得到的公鑰就是小美的。
小二:哎,真讓人頭疼...
三胖:你知道我們平時都有公證處吧?這個公證處是一個可信的結構,經他公證的東西,都是具有可信力度的。
小二:知道啊,前幾天還看新聞說一個老太把他在帝都的一套房產通過公證處公證給了一個沒有血緣關系的小伙。
三胖:那你想想,如果小美的公鑰經過公證后,是不是就能證明這個公鑰是小美的呢?
小二:當然能夠證明。只是網絡中存在這樣的公證處嗎?
三胖:還真存在這樣的公證處,我們把網絡中的公證處稱為CA吧。不得不佩服前輩們,他們把一些可信的CA的證書都預先存在我們的電腦里了,證書包括CA的信息和CA的公鑰。只要你電腦安裝了系統,就安裝了這些證書。來,你看看我電腦里默認安裝的證書。
小二:哦哦,明白了,意思就說這些默認的CA證書是絕對可信的。
三胖:對,就是這個意思。所以,只要CA同時給小美頒發一個證書證明是小美就可以了。CA給小美頒發的證書中,含有小美的個人信息以及小美的公鑰。同時,CA也會給小美頒發一個私鑰。
你先把小美想象成百度,我們先來看CA給百度頒發的證書。
小二:也就是說,只要保證CA給小美頒發的證書能夠安全傳輸到我這里來就可以了。
三胖:對,現在的問題就轉換成了。小美的證書如何能夠安全的傳輸到你這里?其實,CA給小美頒發的證書中,包含【小美的信息+公鑰】、以及數字簽名。 數字簽名的內容是:使用CA私鑰加密過的【小美的信息+公鑰】的hash值。
小二:哦哦,我好像明白了。CA的證書包含CA的公鑰以及CA的一些信息,并且CA的證書默認存儲在我的電腦里了,那我就可以使用CA的公鑰進行解密操作,從而驗證小美的證書是否是正確的了。
三胖:對的。我們可以使用你電腦里CA的公鑰解密小美證書里的數字簽名,從而得到簽名的hash值。然后,你再用同樣的hash算法對【小美的信息+公鑰】進行hash計算。如果小美證書里簽名的hash值與你自己計算出來的hash值一致,就說明這個證書確實是小美的,否則就不是小美的證書。
小二:三胖哥,我算是明白了。https還真是麻煩,但也確實保護了我們的隱私。
三胖:對,有失必有得嘛!
小二:嗯嗯。我現在通過小美的證書安全的獲取了小美的公鑰。那我這兒隨機生成一個對稱加密的秘鑰,這個對稱加密的秘鑰再通過小美的公鑰加密后,就能安全的傳輸給小美了。
三胖:是,小美再用他的私鑰解密,就獲取了你們約定的對稱加密的密碼了。以后,你們就可以使用對稱加密來傳輸數據,暗送秋波了,哈哈~
小二:三胖哥真是太厲害了,從此再也不用擔心跟我女朋友聊天被惡搞了。
三胖:哈哈。你把你自己想成瀏覽器,把小美想成服務器。這就是整個https的傳輸流程。
小二:明白了,我畫一下https在瀏覽器與服務器之間的運行流程,三胖哥你看下對不對。
三胖:不錯不錯,小二很厲害嘛,基本就是這個流程。
小二:沒有沒有,還得多謝三胖哥的指教啊,哈哈。
5、Charles抓取https包的原理
小二:這我還真不知道,按理說https是絕對安全的協議,內容不會被charles抓取啊。
三胖:你記不記得,使用charles抓https包的時候,需要在你手機上安裝charles證書并且信任該證書?
小二:對對,是有這一步操作。
三胖:就是這一步操作,可以使Charles抓取你的https包。我給你畫個流程圖你就明白了。
小二:原來是這樣,這不就是我剛才說的問題嘛。那么就說明https不是安全的協議了?
三胖:不是的。因為你安裝并信任charles證書,是你自己主動的操作,也可以說是你自己主動泄密的結果。如果你不信任該charles證書,那么數據就不會被傳輸,連接會被直接中斷。所以https還是安全的協議。
小二:我明白了,確實是這樣,多謝三胖哥。
Happy Done
https的原理明白了,接下來的事情自然就水到渠成了。
小二列出了接下來要做的事情: 1、向CA(公證處)申請自己網站的證書; 2、修改代碼里靜態資源的http鏈接為https鏈接; 3、修改ajax里面的http鏈接為https鏈接; 4、將證書部署在nginx上; 5、自測完成。
按照這個列表,小二一步步的順利完成了。
最終,https上線完成,愜意的享受午后的陽光吧,happy done~