前言:這篇網(wǎng)絡(luò)系列的初衷是分享下網(wǎng)絡(luò)相關(guān)的知識,文章屬于個人的學(xué)習(xí)總結(jié)博客。部分內(nèi)容來源網(wǎng)絡(luò),如有不適豁护,請私聊。
Android之網(wǎng)絡(luò)—第一篇(Http原理)
Android之網(wǎng)絡(luò)—第二篇(Https原理)
Android之網(wǎng)絡(luò)—第三篇(解讀OkHttp)
Android之網(wǎng)絡(luò)—第四篇(解讀Retrofit)
什么是Https:
說的通俗一點就是身披安全衣的Http欲间,本質(zhì)還是http楚里,只是在http外層嵌套了一個SSL/TLS的安全層,該層做了一些數(shù)據(jù)的加解密處理猎贴。
在講解Https原理之前班缎,先做點準(zhǔn)備工作,因為會涉及到SSL/TLS連接建立她渴、SSL/TLS加解密方面的知識吝梅。所以會整體從網(wǎng)絡(luò)架構(gòu)和比較重要的知識點回顧下網(wǎng)絡(luò)知識。
TCP/IP協(xié)議
在講解什么是SSL/TLS之前惹骂,回顧下TCP/IP協(xié)議的分層概念苏携。通常一個網(wǎng)絡(luò)的傳輸中間會經(jīng)過很多的傳輸節(jié)點,才最終達(dá)到服務(wù)器对粪。期間過程會包含數(shù)據(jù)的拆分和拼裝右冻、IP的解析、數(shù)據(jù)的傳輸?shù)鹊炔僮髦茫蔷W(wǎng)絡(luò)傳輸是很不穩(wěn)定的纱扭,如果這次網(wǎng)絡(luò)請求在中間的某一節(jié)點失敗了,難道還要重新再發(fā)送一遍么儡遮?答案是不應(yīng)該這么做乳蛾。
為了網(wǎng)絡(luò)傳輸?shù)慕y(tǒng)一規(guī)范,就設(shè)計了這么一套網(wǎng)絡(luò)通信的規(guī)范鄙币,每一層都專注做一件事情肃叶,即使當(dāng)前失敗了,也在這層做處理就可以了十嘿,盡量避免重發(fā)因惭。
簡單解釋下,每層的含義:
- 應(yīng)用層:決定了向用戶提供應(yīng)用服務(wù)時候的通信活動绩衷。應(yīng)用層負(fù)責(zé)傳送各種最終形態(tài)的數(shù)據(jù)蹦魔,是直接與用戶打交道的層激率,典型協(xié)議是HTTP、FTP等勿决。
- 傳輸層:負(fù)責(zé)傳送文本數(shù)據(jù)乒躺。傳輸層有兩個性質(zhì)不同的協(xié)議: TCP(Transmission Control Protocol,傳輸控制協(xié)議)和 UDP(User Data Protocol低缩,用戶數(shù)據(jù)報協(xié)議)嘉冒。
- 網(wǎng)絡(luò)層:負(fù)責(zé)分配地址和傳送二進(jìn)制數(shù)據(jù),主要協(xié)議是IP協(xié)議表制;
- 鏈路層:負(fù)責(zé)建立電路連接,是整個網(wǎng)絡(luò)的物理基礎(chǔ)控乾,典型的協(xié)議包括以太網(wǎng)么介、ADSL等。
通過上圖發(fā)現(xiàn)蜕衡,數(shù)據(jù)是由上往下傳遞后壤短,再由下往回傳遞。這是怎么回事呢慨仿?總結(jié)就是:在 TCP / IP 協(xié)議中數(shù)據(jù)先由上往下將數(shù)據(jù)裝包久脯,然后由下往上拆包。在裝包的時候镰吆,每一層都會增加一些信息用于傳輸帘撰,這部分信息就叫報頭,當(dāng)上層的數(shù)據(jù)到達(dá)本層的時候万皿,會將數(shù)據(jù)加上本層的報頭打包在一起摧找,繼續(xù)往下傳遞。在拆包的時候牢硅,每一層將本層需要的報頭讀取后蹬耘,就將剩下的數(shù)據(jù)往上傳。
簡要分析下傳輸過程:
- 首先作為發(fā)送端的客戶端在應(yīng)用層(HTTP 協(xié)議)發(fā)出的HTTP請求(如:想瀏覽www.baidu.com)减余,并生成HTTP報文综苔。
- 為了傳輸方便,在傳輸層(TCP 協(xié)議)把從應(yīng)用層處收到的數(shù)據(jù)(HTTP 請求報文)進(jìn)行分割位岔,并在各個報文上打上標(biāo)記序號及端口號后轉(zhuǎn)發(fā)給網(wǎng)絡(luò)層如筛。
- 在網(wǎng)絡(luò)層(IP 協(xié)議),增加作為通信目的地的 MAC 地址后轉(zhuǎn)發(fā)給鏈路層抒抬。
- 給這些數(shù)據(jù)附加上以太網(wǎng)首部并進(jìn)行發(fā)送處理妙黍,生成的以太網(wǎng)數(shù)據(jù)包將通過物理層傳輸給接收端。
- 接收端的服務(wù)器在鏈路層接收到數(shù)據(jù)瞧剖,按序往上層發(fā)送拭嫁,一直到應(yīng)用層可免。當(dāng)傳輸?shù)綉?yīng)用層,才能算真正接收到由客戶端發(fā)送過來的 HTTP 請求做粤。
TCP的三次握手和四次揮手
這里簡單總結(jié)下傳輸層的兩種連接方式:TCP和UDP
- 用戶數(shù)據(jù)報協(xié)議(UDP):這種類型不要求建立和斷開連接,發(fā)送端可任何時候發(fā)送數(shù)據(jù)怕品,接收端也不知道自己何時從哪里接受數(shù)據(jù)妇垢。
- 傳輸控制協(xié)議(TCP):發(fā)送數(shù)據(jù)之前,需要在收發(fā)主機(jī)之間建立一條通信線路肉康,在通信傳輸前后闯估,專門進(jìn)行建立和斷開連接的處理,如果與對端之間無法通信吼和,可避免發(fā)送無謂的數(shù)據(jù)涨薪。
三次握手:客戶端主動打開連接,服務(wù)器被動打開連接炫乓。
- image.png
第一次握手:客戶端向服務(wù)器發(fā)出連接請求報文刚夺,這是報文首部中的同部位SYN=1,同時選擇一個初始序列號 seq=x 末捣,此時侠姑,TCP客戶端進(jìn)程進(jìn)入了 SYN-SENT(同步已發(fā)送狀態(tài))狀態(tài)。
第二次握手:服務(wù)器收到請求報文后箩做,如果同意連接莽红,則發(fā)出確認(rèn)報文。確認(rèn)報文中應(yīng)該 ACK=1邦邦,SYN=1船老,確認(rèn)號是ack=x+1,同時也要為自己初始化一個序列號 seq=y圃酵,此時柳畔,TCP服務(wù)器進(jìn)程進(jìn)入了SYN-RCVD(同步收到)狀態(tài)。
第三次握手:客戶進(jìn)程收到確認(rèn)后郭赐,還要向服務(wù)器給出確認(rèn)薪韩。確認(rèn)報文的ACK=1,ack=y+1捌锭,自己的序列號seq=x+1俘陷,此時,TCP連接建立观谦,客戶端進(jìn)入ESTABLISHED(已建立連接)狀態(tài)拉盾。服務(wù)器端檢查ack是否為y+1,ACK是否為1豁状,如果正確則連接建立成功捉偏,客戶端和服務(wù)器端進(jìn)入ESTABLISHED狀態(tài)倒得,完成三次握手,隨后客戶端與服務(wù)器端之間可以開始傳輸數(shù)據(jù)了夭禽。
為什么3次握手:
前兩次的握手很顯然是必須的霞掺,主要是最后一次,即客戶端收到服務(wù)端發(fā)來的確認(rèn)后為什么還要想服務(wù)端再發(fā)送一次確認(rèn)呢讹躯?
考慮如下的情況:客戶端發(fā)送了一個連接請求報文段到服務(wù)端,但是在某些網(wǎng)絡(luò)節(jié)點上長時間滯留了潮梯,而后客戶端又超時重發(fā)了一個連接請求報文段該服務(wù)端骗灶,而后正常建立連接,數(shù)據(jù)傳輸完畢秉馏,并釋放了連接耙旦。如果這時候第一次發(fā)送的請求報文段延遲了一段時間后,又到了服務(wù)端沃饶,很顯然母廷,這本是一個早已失效的報文段轻黑,但是服務(wù)端收到后會誤以為客戶端又發(fā)出了一次連接請求糊肤,于是向客戶端發(fā)出確認(rèn)報文段,并同意建立連接氓鄙。但是客戶端認(rèn)為之前的連接已經(jīng)失效了馆揉,不會給服務(wù)器發(fā)送任何數(shù)據(jù),服務(wù)端就會一直等待下去抖拦,直到超出鄙ǎ活計數(shù)器的設(shè)定值,而將客戶端判定為出了問題态罪,才會關(guān)閉這個連接噩茄。這樣就浪費了很多服務(wù)器的資源。
如果采用的是三次握手复颈,就算是那一次失效的報文傳送過來了绩聘,服務(wù)端接受到了那條失效報文并且回復(fù)了確認(rèn)報文,但是客戶端不會再次發(fā)出確認(rèn)耗啦。由于服務(wù)器收不到確認(rèn)凿菩,就知道客戶端并沒有請求連接。
四次揮手:客戶端主動關(guān)閉帜讲,服務(wù)器被動關(guān)閉
- image.png
第一次揮手:客戶端進(jìn)程發(fā)出連接釋放報文衅谷,并且停止發(fā)送數(shù)據(jù)。釋放數(shù)據(jù)報文首部似将,F(xiàn)IN=1获黔,其序列號為seq=u(等于前面已經(jīng)傳送過來的數(shù)據(jù)的最后一個字節(jié)的序號加1)蚀苛,此時,客戶端進(jìn)入FIN-WAIT-1(終止等待1)狀態(tài)肢执。意思是說"我客戶端沒有數(shù)據(jù)要發(fā)給你了"枉阵,但是如果你服務(wù)器端還有數(shù)據(jù)沒有發(fā)送完成,則不必急著關(guān)閉連接预茄,可以繼續(xù)發(fā)送數(shù)據(jù)兴溜。
第二次揮手:服務(wù)器收到連接釋放報文,發(fā)出確認(rèn)報文耻陕,ACK=1拙徽,ack=u+1,并且?guī)献约旱男蛄刑杝eq=v诗宣,此時膘怕,服務(wù)端就進(jìn)入了CLOSE-WAIT(關(guān)閉等待)狀態(tài)。意思是說“你的請求我收到了召庞,但是我還沒準(zhǔn)備好岛心,請繼續(xù)你等我的消息±鹤疲”
客戶端收到服務(wù)器的確認(rèn)請求后忘古,此時,客戶端就進(jìn)入FIN-WAIT-2(終止等待2)狀態(tài)诅诱,等待服務(wù)器發(fā)送連接釋放報文(在這之前還需要接受服務(wù)器發(fā)送的最后的數(shù)據(jù))髓堪。第三次揮手:服務(wù)器將最后的數(shù)據(jù)發(fā)送完畢后,就向客戶端發(fā)送連接釋放報文娘荡,F(xiàn)IN=1干旁,ack=u+1,由于在半關(guān)閉狀態(tài)炮沐,服務(wù)器很可能又發(fā)送了一些數(shù)據(jù)争群,假定此時的序列號為seq=w,此時大年,服務(wù)器就進(jìn)入了LAST-ACK(最后確認(rèn))狀態(tài)换薄,等待客戶端的確認(rèn)。意思是說“好了鲜戒,我數(shù)據(jù)發(fā)送完畢了专控,你可以關(guān)閉了《舨停”
第四次揮手:客戶端收到服務(wù)器的連接釋放報文后伦腐,必須發(fā)出確認(rèn),ACK=1失都,ack=w+1柏蘑,而自己的序列號是seq=u+1幸冻,此時,客戶端就進(jìn)入了TIME-WAIT(時間等待)狀態(tài)咳焚,如果服務(wù)器端沒有收到ACK則可以重傳洽损。注意此時TCP連接還沒有釋放,必須經(jīng)過2MSL(最長報文段壽命)的時間后革半,當(dāng)客戶端撤銷相應(yīng)的TCB后碑定,才進(jìn)入CLOSED狀態(tài)。而服務(wù)器只要收到了客戶端發(fā)出的確認(rèn)又官,立即進(jìn)入CLOSED狀態(tài)延刘。
為什么客戶端最后還要等待2MSL:
第一,保證客戶端發(fā)送的最后一個ACK報文能夠到達(dá)服務(wù)器六敬,因為這個ACK報文可能丟失碘赖,站在服務(wù)器的角度看來,我已經(jīng)發(fā)送了FIN+ACK報文請求斷開了外构,客戶端還沒有給我回應(yīng)普泡,應(yīng)該是我發(fā)送的請求斷開報文它沒有收到,于是服務(wù)器又會重新發(fā)送一次审编,而客戶端就能在這個2MSL時間段內(nèi)收到這個重傳的報文撼班,接著給出回應(yīng)報文,并且會重啟2MSL計時器割笙。
第二权烧,防止類似與“三次握手”中提到了的“已經(jīng)失效的連接請求報文段”出現(xiàn)在本連接中眯亦∩烁龋客戶端發(fā)送完最后一個確認(rèn)報文后,在這個2MSL時間中妻率,就可以使本連接持續(xù)的時間內(nèi)所產(chǎn)生的所有報文段都從網(wǎng)絡(luò)中消失乱顾。這樣使下一個新的連接中不會出現(xiàn)舊連接的請求報文。
名詞解釋:
- ACK:TCP報頭的控制位之一,對數(shù)據(jù)進(jìn)行確認(rèn).確認(rèn)由目的端發(fā)出,用它來告訴發(fā)送端這個序列號之前的數(shù)據(jù)段都收到了.比如,確認(rèn)號為X,則表示前X-1個數(shù)據(jù)段都收到了,只有當(dāng)ACK=1時,確認(rèn)號才有效,當(dāng)ACK=0時,確認(rèn)號無效,這時會要求重傳數(shù)據(jù),保證數(shù)據(jù)的完整性.
- SYN:同步序列號宫静,TCP建立連接時將這個位置1走净。
- FIN:發(fā)送端完成發(fā)送任務(wù)位,當(dāng)TCP完成數(shù)據(jù)傳輸需要斷開時孤里,提出斷開連接的一方將置1
現(xiàn)代密碼學(xué)
說個概念性的東西就是伏伯,現(xiàn)代密碼學(xué)分為對稱加密和非對稱加密,跟傳統(tǒng)密碼學(xué)不一樣的地方就是捌袜,除了可以加密文字內(nèi)容外说搅,還可以用于各種二進(jìn)制數(shù)據(jù)的加解密。
對稱加密:
通信雙方使用同一個密鑰虏等,使用加密算法配合上密鑰來加密弄唧,解密時使用解密算法(加密過程的完全逆運算)配合密鑰來進(jìn)行解密适肠。常用的經(jīng)典算法:DES(56 位密鑰,密鑰太短而逐漸被棄用)候引、AES(128 位侯养、192 位、256 位密鑰澄干,現(xiàn)在最流行)逛揩。
非對稱加密:
通信雙方使用公鑰和加密算法對數(shù)據(jù)進(jìn)行加密得到密文;使用私鑰和加密算法對數(shù)據(jù)進(jìn)行解密得到原數(shù)據(jù)麸俘。常用的經(jīng)典算法:RSA(可用于加密和簽名)息尺、DSA(僅用于簽名,但速度更快)疾掰。
這個有什么用搂誉?其實這個就是后面Https加解密的原理。原理這么簡單么静檬?是的炭懊,就這么簡單。但是要理解還得慢慢往下看拂檩。
- 第一個問題:這些對稱加密和非對稱加密的破解都有哪些侮腹?
暴力破解法(窮舉法):對于對稱加密而言,我只要拿到密鑰就可以破解了稻励。同樣的父阻,非對稱加密只要拿到私鑰也就搞定了。所以只要拿一堆密碼一個個的試望抽,在最短的時間內(nèi)找到對應(yīng)的密鑰/私鑰就搞定了加矛。
而反破解,或者對一個優(yōu)秀加密算法的定義標(biāo)準(zhǔn)是煤篙,讓破解者找不到比窮舉法(暴力力破解法)更有效的破解手段斟览,并且窮舉法的破解時間足夠長(例如數(shù)千年)
- 第二個問題:這些對稱加密和非對稱加密的優(yōu)缺點?
對稱加密:不能在不安全網(wǎng)絡(luò)上傳輸密鑰辑奈,一旦密鑰泄露則加密通信失敗苛茂。
正常的網(wǎng)絡(luò)傳輸是要經(jīng)過很多個節(jié)點的,為了保證通信的雙方正常通信鸠窗,都必須要求知道密鑰妓羊,但是密鑰如果在網(wǎng)絡(luò)傳輸中就很容易被劫持。有泄漏的風(fēng)險稍计。如下場景:在網(wǎng)絡(luò)傳輸?shù)倪^程中在某個節(jié)點被C劫持躁绸,C就可以解密你傳輸?shù)膬?nèi)容啦。
image.png非對稱加密:可以在不安全網(wǎng)絡(luò)上傳輸密鑰(準(zhǔn)確來說是公鑰),但是計算復(fù)雜涨颜,因此性能比對稱加密差很多费韭。
在正常的網(wǎng)絡(luò)上通信,為保證正常通信庭瑰,通信的雙方都需要持有對方的公鑰將數(shù)據(jù)加密后發(fā)送給對方星持,接收方再將加密的數(shù)據(jù)通過自己的私鑰解密出來。這樣即使在傳輸?shù)哪硞€節(jié)點被C劫持了弹灭,C也解密不了你的數(shù)據(jù)督暂,因為數(shù)據(jù)只能用私鑰來解。
image.png
![]()
- 第三個問題:私鑰加密的數(shù)據(jù)缠诅,用公鑰來解能解么?
根據(jù)上面的場景乍迄,A用B的公鑰加密的數(shù)據(jù)發(fā)送給B管引,B用私鑰可以解。反過來闯两?B用私鑰加密的數(shù)據(jù)發(fā)送給A褥伴,A用B的公鑰能不能解?答案是可以的漾狼。下面舉個不規(guī)范的例子說明下:
有個數(shù)字庫:0123456789包含十個數(shù)字重慢,加密算法都定義為:兩數(shù)相加,滿十時取個位邦投。
正常邏輯:A 有原數(shù)據(jù)為110伤锚,使用B的公鑰4和加法算法后的密文為554擅笔;然后B用自己的私鑰6和加密算法解密后的數(shù)據(jù)為110.
image.png反向邏輯:B有原數(shù)據(jù)110志衣,使用自己的私鑰和加密算法加密后的密文為776;然后A用B的公鑰4和加密算法解密后的數(shù)據(jù)同樣為110.
image.png結(jié)論就是:公鑰加密的數(shù)據(jù)用私鑰可以解猛们,私鑰加密的數(shù)據(jù)念脯,用公鑰也可以解。但是要注意的是弯淘,公鑰和私鑰是不能對調(diào)的绿店。
簽名和驗證:
A用自己的私鑰通過加密算法得到的數(shù)據(jù)密文數(shù)據(jù),這個數(shù)據(jù)就可以稱為簽過名转培。接收方B再用A提供的公鑰通過加密算法就可以還原數(shù)據(jù)恶导,從而就驗證了數(shù)據(jù)的真實性。因為只有A一個人擁有自己的私鑰浸须。
到這里咱們就可以聊聊剛才中間人偽造數(shù)據(jù)是如何處理了惨寿。通過對稱加密可以防止中間人偷窺數(shù)據(jù),通過數(shù)字簽名可以防止中間人篡改偽造數(shù)據(jù)删窒。
但是完整版的簽名信息需要將簽名數(shù)據(jù)取Hash值裂垦,減少數(shù)據(jù)大小
Https的加密原理分析
好了,看完理解了上面的知識點肌索,到這里我們可以慢慢分析Https是如何工作的了蕉拢。
先來總結(jié)一句話:Https的本質(zhì)就是在客戶端和服務(wù)端之間用非對稱加密協(xié)商出一套對稱密鑰,每次發(fā)送信息之前將內(nèi)容加密诚亚,接收后解密企量,達(dá)到內(nèi)容的加密傳輸。解釋下亡电,就是整個數(shù)據(jù)的傳輸過程是用對稱加密的方式來傳輸?shù)慕旃皇敲荑€的生成是由客戶端和服務(wù)端在創(chuàng)建連接的時候
通過非對稱加密的方式
協(xié)商生成的。
那這里就會有一系列的問題啦:
Q:為什么不直接用非對稱加密的方式直接加密呢份乒?
A:因為非對稱加密的計算過程是復(fù)雜的數(shù)學(xué)運算恕汇,太復(fù)雜了,很慢或辖。
Q:哦哦瘾英,那既然使用對稱加密的話,這個對稱密鑰是怎么來的颂暇?
A:在實際的場景中缺谴,服務(wù)端會對接N個客戶端,這個對稱密鑰如果都使用同一個密鑰來通信的話耳鸯,肯定是不合理的湿蛔,只要破解了其中一個,其他所有的都會被破解县爬。所以整體的網(wǎng)絡(luò)架構(gòu)應(yīng)該是使用不同加密方式用不同的密鑰來進(jìn)行數(shù)據(jù)傳輸?shù)难羯丁DP腿缦聢D
Q:但是在網(wǎng)絡(luò)場景中,對稱加密的密鑰是不能直接在網(wǎng)絡(luò)上傳輸?shù)牟圃7?wù)端和客戶端是如何都知道的呢察迟?
A:這個是服務(wù)端和客戶端一起協(xié)商根據(jù)只有它倆知道的規(guī)則分別生成斩狱,就不用通過網(wǎng)絡(luò)傳輸啦。
Q:如果保證它倆協(xié)商出來的密鑰不被破解呢扎瓶?
A:當(dāng)然是使用非對稱加密的方式啦所踊。通過之前的加密知識,可以知道非對稱加密是目前來說是絕對安全的概荷。而且一個私鑰可以有多個公鑰污筷,正好滿足一個服務(wù)端對N個客戶端的場景。模型如下圖:
實際在協(xié)商通訊的過程中乍赫,這個公鑰是服務(wù)端給客戶端發(fā)送的瓣蛀。而且需要注意這個公鑰是用來協(xié)商生成對稱密鑰的,不是用來做數(shù)據(jù)的加密傳輸?shù)?/code>雷厂。
Q:哦哦惋增,原來是這樣,但是這樣子還是有問題啊改鲫,客戶端與服務(wù)端在協(xié)商生成密鑰的過程中為了保證數(shù)據(jù)被偷窺和被篡改的風(fēng)險诈皿,一般會要求有兩套公鑰和私鑰分別做加解密和簽名驗證處理的,上面的模型只有一套公鑰和私鑰像棘,沒法規(guī)避數(shù)據(jù)被被篡改的風(fēng)險呀稽亏。
A:能提出這個問題,說明之前的學(xué)習(xí)理解得很好缕题。從上面的模型截歉,可以保證在協(xié)商的過程中客戶端A/B/C/D分別向服務(wù)器傳輸?shù)臄?shù)據(jù)是安全。但是服務(wù)器發(fā)送給客戶端的數(shù)據(jù)是如何保證的呢烟零?換句話說就是瘪松,客戶端如何驗證數(shù)據(jù)是服務(wù)端發(fā)送過來的,而不是被中間假冒掉包的數(shù)據(jù)锨阿。這不就是之前講的數(shù)字簽名的內(nèi)容么宵睦?而實際情況中,就是通過CA證書來處理這個問題的墅诡。
Q:那這個CA證書是怎么驗證的呢壳嚎?
A:請看下面的CA證書的分析。
CA證書鏈分析末早。
回歸之前的分析烟馅,我們的問題點卡在了“服務(wù)器發(fā)送給客戶端的數(shù)據(jù)是如何保證的呢”。對吧荐吉。實際上在協(xié)商通信的過程中焙糟,服務(wù)端會先給客戶端下發(fā)證書信息,這個證書信息里面會包含非對稱加密的公鑰样屠。但是考慮一個問題,如何保證這個公鑰就是客戶端要的公鑰呢?或者說怎么保證這個證書就是真實的證書痪欲,而不是被篡改假冒的證書悦穿。只有驗證了這一步,客戶端才完全信賴服務(wù)端业踢,才給服務(wù)器發(fā)消息栗柒,也才接受服務(wù)器的消息。這時候就只需要一套公鑰和私鑰客戶端和服務(wù)端就可以通信了知举。
Q:那客戶端如何驗證服務(wù)端下發(fā)的證書和公鑰是正確的呢瞬沦?
A:先換個概念,將證書里面的公鑰假設(shè)為一串?dāng)?shù)據(jù)雇锡。要驗證這個數(shù)據(jù)逛钻,只需要提供這串?dāng)?shù)據(jù)的簽名以及加密這段數(shù)據(jù)的簽名的私鑰對應(yīng)的公鑰就可以了,如下圖框框所示锰提。
Q:那這樣子又有另外的一個問題產(chǎn)生了怎么去驗證這段數(shù)據(jù)的簽名的私鑰對應(yīng)的公鑰
了曙痘?
A:同樣的,也是需要提供對應(yīng)的簽名和對應(yīng)簽名的私鑰對應(yīng)的公鑰立肘。
Q:但是這樣子下去就會變成一個循環(huán)了边坤,怎么辦竣稽?
其實在這里還會有一個場景問題:第三方簽發(fā)機(jī)構(gòu)不可能只給你一家公司制作證書椭赋,它也可能會給中間人這樣有壞心思的公司發(fā)放證書。這樣的锐想,中間人就有機(jī)會對你的證書進(jìn)行調(diào)包融蹂,客戶端在這種情況下是無法分辨出是接收的是你的證書文黎,還是中間人的。因為不論中間人殿较,還是你的證書耸峭,都能使用第三方簽發(fā)機(jī)構(gòu)的公鑰進(jìn)行解密。
A:是的淋纲,為處理這個問題劳闹,就需要講一個根證書的東西。先舉個例子:假設(shè)你是HR洽瞬,你手上拿到候選人的學(xué)歷證書本涕,證書上寫了持證人,頒發(fā)機(jī)構(gòu)伙窃,頒發(fā)時間等等菩颖,同時證書上,還寫有一個最重要的:證書編號为障!我們怎么鑒別這張證書是的真?zhèn)文鼗奕颍恐灰弥@個證書編號上相關(guān)機(jī)構(gòu)去查放祟,如果證書上的持證人與現(xiàn)實的這個候選人一致,同時證書編號也能對應(yīng)上呻右,那么就說明這個證書是真實的跪妥。同樣的,Https請求驗證時声滥,會用到手機(jī)操作系統(tǒng)內(nèi)置的根證書去驗證這個證書的真?zhèn)蔚摹?/p>
到這里就簡要分析完了證書的驗證過程眉撵。證書會包含很多信息,包括服務(wù)器公鑰落塑,服務(wù)器名字纽疟,服務(wù)器地區(qū)等等信息。這個是沒法篡改的憾赁。其中對Https連接來說最重要的就是服務(wù)器的公鑰缠沈。
Https連接
之前學(xué)習(xí)完TCP的連接過程颓芭,現(xiàn)在我們開始來嘮嘮Https連接。什么是Https連接呢州藕?準(zhǔn)確來說就是SSL/TLS加解密層的連接床玻。
大致的建立流程:
- 1、客戶端請求建立TLS連接
- 2待牵、服務(wù)端發(fā)回證書
- 3缨该、客戶端驗證服務(wù)端證書
- 4蛤袒、客戶端信任服務(wù)器后與服務(wù)端協(xié)商對稱密鑰
- 5皱碘、使用對稱密鑰開始通信
詳細(xì)的建立流程:
1健蕊、客戶端給服務(wù)器發(fā)送一個Client Hello缩功。同時會還會發(fā)送一些附加信息,客戶端支持的可選TLS的版本信息,比如支持1.0/1.1啦桌;Cipher Suite(加密套件):客戶端支持的對稱加密算法有哪些,比如AES/DES板驳。支持的非對稱加密算法有哪些若治,比如RAS和支持的Hash算法等等加密信息;同時還會有一個客戶端的隨機(jī)數(shù)。
2洽蛀、服務(wù)端收到信息后峡碉,會給客戶端一個回應(yīng)Server Hello。同時也會發(fā)送一些附加信息地来。服務(wù)端選定TLS的版本,比如1.1蜡秽;選定的Cipher Suite(加密套件):對稱加密用AES,非對稱加密用RAS等等選定的加密方式;同時還會有一個服務(wù)端的隨機(jī)數(shù)睬澡。
接著,服務(wù)器給客戶端下發(fā)證書。3云稚、客戶端驗證該證書信息,拿到證書內(nèi)的公鑰拐格。
注意,在驗證這一步的時候金踪,可以區(qū)分證書是否是被劫持假冒的證書劣领。如果是假冒的,驗證不通過村生,https鏈接失敗肄鸽。4蟀苛、客戶端產(chǎn)生一個隨機(jī)數(shù)pre-master secret并加密后發(fā)送給服務(wù)器梅鹦。這時候客戶端和服務(wù)端就可以計算對稱密鑰了嗤栓。
注意,即使劫持方攔截后,還將正確的證書下發(fā)給客戶端马昙,客戶端驗證通過后土匀,加密后的隨機(jī)數(shù)發(fā)送給服務(wù)器被劫持后,也只有服務(wù)器的私鑰能解,不怕信息泄露和篡改。即使劫持篡改了哼鬓,后續(xù)生成對應(yīng)的對稱密鑰是不一致的宠互。在第五步,互相發(fā)送驗證消息時是驗證不通過的。https鏈接也失敗。
將客戶端隨機(jī)數(shù)和服務(wù)端隨機(jī)數(shù)及pre-master secret通過算法計算出對稱密鑰Master secret。其實這個Master secret包含的信息主要有四個:客戶端加密密鑰,服務(wù)端加密密鑰虑鼎,客戶端MAC secret,服務(wù)端MAC secret划址。具體的使用是:客戶端發(fā)送加密數(shù)據(jù)時,服務(wù)端用客戶端密鑰解密;服務(wù)端發(fā)送加密數(shù)據(jù)時封恰,客戶端用服務(wù)端密鑰解密。
為啥要這么處理呢?主要是防止消息被扔回來低飒。如果只有一個密鑰的話,場景是:A:“分手吧” 褥赊。期待B看到后有回應(yīng)“別分手”。但是中間劫持后崭倘,雖然看不懂,但是直接扔回來司光。然后A解密看到就是“分手吧”。那就涼涼了
客戶端MAC secret榆俺,服務(wù)端MAC secret的主要作用:用來認(rèn)證這個消息是正確的,完整的茴晋,解決對稱加密方式?jīng)]法驗證消息的缺點。
- 5回窘、客戶端和服務(wù)端相互發(fā)送驗證信息(不過是客戶端先發(fā)送)
至此完整的Https在TLS層連接過程分析完畢诺擅。
后序:關(guān)于Https原理篇主要涉及到的知識點比較多,主要是請求連接的過程及數(shù)據(jù)的加解密模塊啡直。后續(xù)文章會針對原理的內(nèi)容從源碼角度去解讀OkHttp和Retrofit兩個官方開源的網(wǎng)絡(luò)庫烁涌。
如果覺得我的文章對你有幫助,請隨意贊賞酒觅。您的支持將鼓勵我繼續(xù)創(chuàng)作撮执!