1脏答、概述
互聯(lián)網(wǎng)上進(jìn)行的任何活動(dòng)(閱讀本文尖淘,朋友圈上傳圖片萍摊,在淘寶上買東西)都可以歸結(jié)為向服務(wù)器發(fā)送消息和從服務(wù)器接收消息当凡。而兩者之間傳遞消息就需要遵守一些協(xié)議山害,不然的話就如同雞同鴨講,根本沒法進(jìn)行溝通沿量。其中在應(yīng)用層用的最多的就是HTTP協(xié)議(HyperText Transfer Protocol浪慌,超文本傳輸協(xié)議)。而HTTP協(xié)議傳輸?shù)臄?shù)據(jù)沒有進(jìn)行過任何加密操作朴则,基本上就相當(dāng)于在網(wǎng)上裸奔权纤。于是在HTTP協(xié)議的基礎(chǔ)上,出了一個(gè)HTTPS協(xié)議(HyperText Transfer Protocol over Secure Socket Layer)乌妒⌒谙耄可以理解為HTTP+SSL/TLS, 即 HTTP 下加入 SSL 層撤蚊,HTTPS 的安全基礎(chǔ)是 SSL/TLS古掏,加密的處理就需要 SSL/TLS,用于安全的 HTTP 數(shù)據(jù)傳輸侦啸。
2、類比解釋HTTPS原理及誕生過程
2.1 開始天真的溝通
我們這邊有一群小甲和一個(gè)小乙光涂,小甲們是小乙的粉絲庞萍,而當(dāng)時(shí)只能通過飛鴿傳書來傳遞小甲們對(duì)小乙的喜愛之情。一開始是這樣的顶捷,每次小甲們想要想給小乙傳信件的時(shí)候挂绰,就把信件綁在信鴿腿上屎篱,通過信鴿飛到小乙那邊服赎,小乙從信鴿腿上去下信件讀取消息葵蒂,然后根據(jù)信件里的發(fā)件人和地址用同樣的方式回信件給小甲們。
直到有一天重虑,有個(gè)叫小壞的人践付,在信鴿飛行的途中,把信鴿攔截了下來缺厉,偷偷看了里面的信件永高,甚至還修改了信件里面的內(nèi)容,再把信鴿放走讓它繼續(xù)往目的地飛過去提针。這個(gè)操作有天被小甲們和小乙知道了命爬,他們就不樂意了,感覺自己的隱私受到了侵犯辐脖。
2.2 加密
于是小甲們和小乙就決定用密碼寫他們的信息饲宛,他們將每個(gè)字母在字母表中移動(dòng)3個(gè)位置。例如嗜价,D→A艇抠,E→B,F(xiàn)→C久锥。消息“secret message”將是“pbzobq jbppxdb”〖矣伲現(xiàn)在如果小壞就算攔截了鴿子,也看不懂里面的內(nèi)容了瑟由。
可是好景不長絮重,有個(gè)小甲有一天說漏了嘴,讓小壞知道了加密規(guī)則歹苦,小壞按照規(guī)則绿鸣,就可以反推出真實(shí)的消息。
這時(shí)候小甲們和小乙決定暂氯,每個(gè)小甲每一串互發(fā)信件的過程潮模,都和小乙重新商討一遍加密規(guī)則。這樣就算小壞知道了其中一個(gè)小甲這串信件的規(guī)則痴施,頂多也就能破解這個(gè)小甲和小乙這串信件擎厢,對(duì)于其他小甲們和其他信件串就無法破解了。
但問題又出現(xiàn)了辣吃,小甲和小乙都不在一個(gè)地方动遭,商討規(guī)則也只能通過飛鴿傳書,如果每次在商討規(guī)則的時(shí)候鴿子被小壞截下來了神得,那豈不是又就要被小壞知道秘密了厘惦。
2.3 飛鴿帶箱子
為了解決上面一個(gè)問題,小甲們和小乙提供了一個(gè)更好的方案哩簿。當(dāng)小甲想要給小乙發(fā)送封信件的時(shí)宵蕉,會(huì)按照下面的步驟進(jìn)行操作:
① 小甲發(fā)送一封沒有內(nèi)容的信件通過鴿子給小乙酝静。
② 小乙把鴿子帶回家,給鴿子綁上一個(gè)開著帶鎖的箱子羡玛,自己保存著開鎖的鑰匙别智。
③ 小甲拿到箱子,把信放在箱子里面稼稿,合上箱子薄榛,通過鴿子給小乙
④ 小乙拿到箱子,通過鑰匙打開箱子让歼,讀取信件敞恋。
這樣小壞就算攔截了鴿子,沒有鑰匙也打不開箱子谋右,也就無法讀取里面的信件了耳舅。這樣一來問題看似就解決了,但是還出來了一個(gè)新的問題,如果小壞偽裝成小乙,在小乙給小甲箱子的時(shí)候把鴿子攔截下來须板,換上一個(gè)新的鑰匙在小壞手里的箱子坤次。那之后小甲把信件放在這個(gè)箱子里,傳給小乙時(shí)候,小壞再攔下這個(gè)鴿子,打開箱子,讀取修改信件冕香,再把信件放到小乙給的那個(gè)箱子里。那不就又被小壞得逞了后豫。
2.4 確認(rèn)箱子是真的
為了解決上面一個(gè)問題悉尾,小乙決定給自己的箱子簽上名。這樣當(dāng)小甲收到箱子時(shí)候檢查一下這個(gè)簽名是不是小乙的簽名挫酿,這樣就可以判斷中途箱子有沒有被小壞掉包了构眯。但是小甲如何判斷小乙的簽名的真假呢?這時(shí)候小甲和小乙就找到了一批德高望重的長者早龟。長者給了小乙一個(gè)含有小乙名字的印章惫霸,每次傳箱子時(shí)候,在箱子上蓋一個(gè)這個(gè)印章葱弟。同時(shí)德高望重的長者承諾給人頒發(fā)印章時(shí)候壹店,只會(huì)給人發(fā)這個(gè)人自己名字的印章,而不會(huì)給他發(fā)別人名字的印章芝加。小甲拿到箱子時(shí)候硅卢,看到印章里面的名字是小乙,再去問一下長者,這個(gè)印子是真印子沒錯(cuò)吧将塑。得到長者的肯定答復(fù)后脉顿,就可以確定這個(gè)箱子是小乙傳來的那個(gè)箱子了。到此似乎小壞已經(jīng)沒有空子可以鉆了抬旺。但還有一個(gè)問題弊予,那就是祥楣,如果小乙小給小甲回消息开财,似乎也要有這么一個(gè)傳箱子的費(fèi)勁事情。而且箱子真的很重误褪,鴿子不想一直帶著箱子來回跑责鳍。
2.5 箱子太重
雖然前面的一頓操作已經(jīng)讓小壞沒有機(jī)會(huì)了。但是箱子真的太重了兽间,影響了鴿子的飛行速度历葛。于是小甲們和小乙決定,小甲只在箱子里面放加密規(guī)則嘀略。一旦小乙收到加密規(guī)則后恤溶,之后的通信就按照前面所說的加密方式進(jìn)行通信。因?yàn)橐呀?jīng)通過箱子印章操作解決了在商討規(guī)則時(shí)候被小壞攔截下來的問題帜羊。
到此整個(gè)小甲們和小乙通信的過程就得到了很好的保密咒程,同時(shí)也盡可能的減少了鴿子的壓力。
3讼育、HTTPS原理解釋
其實(shí)HTTPS的操作就如同前面所說帐姻,接下來從專業(yè)的角度解釋一下前面所說的小甲們小乙長者箱子等個(gè)代表什么意思,同時(shí)再串一遍HTTPS的通信過程奶段。
小甲們:客戶端
小乙:服務(wù)端
小壞:黑客
商討規(guī)則的加密方式:對(duì)稱加密
箱子和鑰匙:非對(duì)稱加密里的公鑰和私鑰
長者們:證書頒發(fā)機(jī)構(gòu)CA饥瓷,如Symantec、Comodo痹籍、GoDaddy呢铆、GlobalSign等。
長者給小乙印章:如果需要采用HTTPS協(xié)議服務(wù)端需要向CA申請(qǐng)認(rèn)證證書蹲缠。
箱子太重:非對(duì)稱加密要比對(duì)稱加密復(fù)雜刺洒,加解密過程更加耗費(fèi)時(shí)間。
而整個(gè)HTTPS通信步驟大致如下:
① 客戶端發(fā)送一個(gè)空消息給服務(wù)端
② 服務(wù)端將包含有非對(duì)稱加密公鑰和CA認(rèn)證證書的服務(wù)器證書傳給客戶端
③ 客戶端根據(jù)放在本地庫里面的CA證書列表判斷傳來的CA認(rèn)證證書是否是有效的
④ 客戶端隨機(jī)生成對(duì)稱加密公鑰吼砂,并將這個(gè)對(duì)稱加密公鑰用從服務(wù)器傳來的非對(duì)稱加密公鑰加密逆航,發(fā)給服務(wù)端。
⑤ 服務(wù)端收到用非對(duì)稱加密公鑰加密過的數(shù)據(jù)渔肩,通過非對(duì)稱加密的私鑰解密因俐,獲取里面的對(duì)稱加密公鑰。
⑥ 服務(wù)端和客戶端用對(duì)稱加密公鑰對(duì)消息進(jìn)行加密后互相發(fā)送通信。
4抹剩、SSL/TSL
根據(jù)前面所述撑帖,已經(jīng)大致走通了HTTPS的通信流程,這邊再對(duì)服務(wù)端(小乙)如何CA機(jī)構(gòu)(長者們)申請(qǐng)認(rèn)證證書(印章)澳眷,以及客戶端(小甲們)如何向驗(yàn)證證書進(jìn)行一下說明胡嘿。這層驗(yàn)證是基于網(wǎng)絡(luò)層里面SSL/TSL層進(jìn)行的。
CA即證書授權(quán)中心( certificate authority)钳踊,這些機(jī)構(gòu)受國際認(rèn)可衷敌。他會(huì)對(duì)他受信任的申請(qǐng)對(duì)象頒發(fā)相應(yīng)的證書server.crt,同時(shí)他可以隨時(shí)吊銷申請(qǐng)對(duì)象的證書拓瞪。而客戶端的本地一般會(huì)存儲(chǔ)有ca.crt缴罗,可以來驗(yàn)證server.crt的正確性。要看本地的ca.crt對(duì)于chrome瀏覽器可以通過:設(shè)置 -> 高級(jí) -> 管理證書 -> 授權(quán)中心 查看祭埂。服務(wù)端想申請(qǐng)server.crt面氓,需要先生成一對(duì)server.pub/server.key(傳信件的帶鎖箱子和解鎖鑰匙),然后將組織信息蛆橡,個(gè)人信息(域名等)和server.pub(帶鎖箱子)一起打包成一個(gè)server.req即申請(qǐng)認(rèn)證文件給CA認(rèn)證機(jī)構(gòu)舌界。CA認(rèn)證機(jī)構(gòu)通過線上、線下等多種手段驗(yàn)證申請(qǐng)者提供信息的真實(shí)性泰演,如組織是否存在呻拌、企業(yè)是否合法,是否擁有域名的所有權(quán)等粥血。如果一切合法柏锄,就向申請(qǐng)者簽發(fā)認(rèn)證文件證書。證書里面包含如下信息:申請(qǐng)者公鑰(帶鎖箱子)复亏、申請(qǐng)者的組織信息和個(gè)人信息趾娃、簽發(fā)機(jī)構(gòu) CA的信息、有效時(shí)間缔御、證書序列號(hào)等明文信息抬闷,同時(shí)包含一個(gè)簽名。最后一個(gè)簽名很關(guān)鍵耕突,它是通過如下算法生成的:首先笤成,使用散列函數(shù)計(jì)算明文信息的信息摘要。然后用 CA的私鑰(ca.key)對(duì)信息摘要進(jìn)行加密眷茁,密文就是這個(gè)簽名炕泳。而這個(gè)簽名的解密公鑰就是前面說的放在本地的ca.crt。每當(dāng)客戶端向服務(wù)端發(fā)起請(qǐng)求上祈,服務(wù)端需要返回證書文件培遵≌丬剑客戶端讀取證書中的明文信息,采用同樣的散列函數(shù)計(jì)算得到信息摘要籽腕。然后利用對(duì)應(yīng)CA機(jī)構(gòu)的ca.crt去解密簽名嗡呼。如果計(jì)算的信息摘要和解密出來的簽名一致,代表這個(gè)信息沒有被篡改過皇耗,是可信的信息南窗。也就是說信息里面的公鑰(帶鎖箱子)合法,客戶端然后會(huì)驗(yàn)證證書相關(guān)的域名信息郎楼、有效時(shí)間万伤、是否吊銷等信息。 一切通過了箭启,這時(shí)候就可以用證書明文信息里面的公鑰(帶鎖箱子)進(jìn)行加密客戶端隨機(jī)生成的對(duì)稱加密的公鑰了壕翩。整個(gè)流程如下圖:
Tips:從上面的表述可以看到蛉迹,公鑰可以用來加密也可以用來解密傅寡,私鑰也是一樣。兩者的區(qū)別在于私鑰只有創(chuàng)建者知道北救,公鑰是傳出去給需要的人用的荐操。公鑰加密的信息只有對(duì)應(yīng)私鑰能解密讀取,私鑰加密的信息只有對(duì)應(yīng)公鑰能解密讀取珍策。CA就是用自己的私鑰(ca.key)對(duì)證書加密托启,用公鑰(ca.crt)對(duì)證書解密。而服務(wù)端是用公鑰(帶鎖箱子)來對(duì)信息進(jìn)行加密攘宙,用私鑰(解鎖鑰匙)來對(duì)信息進(jìn)行解密的屯耸。這種是一對(duì)公私鑰的加密方式指非對(duì)稱加密〔渑客戶端隨機(jī)生成的一對(duì)都是公鑰的加密方式指對(duì)稱加密疗绣,這種被公鑰加密過的信息,所有公鑰都能解密出來铺韧。