多年以前,我還在上大學(xué)的時(shí)候,曾經(jīng)聽(tīng)我學(xué)長(zhǎng)說(shuō)起打過(guò)的一份工,每個(gè)月可以賺不少零花錢。這份工作非常簡(jiǎn)單,就是去互聯(lián)網(wǎng)上流行的各種網(wǎng)站、手機(jī)上流行的各大APP,以及各個(gè)網(wǎng)站的手機(jī)瀏覽器版本(WAP、H5之類的概念),執(zhí)行一些基本的操作,包括注冊(cè)、登錄,包括具體的業(yè)務(wù),比如航空類的網(wǎng)站,就嘗試查詢航班、購(gòu)買機(jī)票;比如團(tuán)購(gòu)類的網(wǎng)站,就嘗試搜索美食、發(fā)布評(píng)價(jià)。
在操作的同時(shí),通過(guò) 這樣的抓包軟件把所有的通信包全部記錄下來(lái),并分析其中的 HTTP 數(shù)據(jù)。你會(huì)發(fā)現(xiàn),所有的賬號(hào)信息、業(yè)務(wù)內(nèi)容,絕大部分都以明文的形式在互聯(lián)網(wǎng)上流動(dòng),即使少部分看起來(lái)是亂碼,經(jīng)過(guò)簡(jiǎn)單的解碼、解密,通常也可以快速獲取原文。
學(xué)長(zhǎng)告訴我,這樣的世界太不安全了。當(dāng)你想要通過(guò)互聯(lián)網(wǎng)完成任何一件事情,你都需要從你的電腦或者手機(jī)發(fā)起一系列 HTTP 請(qǐng)求。這些請(qǐng)求通過(guò)一層層的路由,最終送到千里之外的某臺(tái)服務(wù)器。在這之中,你同宿舍的室友可能在偷看你的聊天,你的學(xué)校也可能以安全為由監(jiān)控著你的行蹤,還有一些不法分子則在暗中記錄你的賬號(hào)和密碼。在這之中,許許多多的釣魚(yú)網(wǎng)站通過(guò)攔截你的網(wǎng)絡(luò),假冒銀行、政府,獲取你的信任,套取你的信息。在這之中,運(yùn)營(yíng)商可能為了利益,在你正常瀏覽的網(wǎng)頁(yè)中嵌入了生硬的廣告,篡改了原始內(nèi)容。所幸,我們有了 HTTPS。它簡(jiǎn)直就是這一切的救世主。▍HTTP 帶來(lái)的風(fēng)險(xiǎn)HTTPS,中文名是「超文本傳輸安全協(xié)議」( )。它以 HTTP 為基礎(chǔ),為 HTTP 提供額外的加密和認(rèn)證。這也就是名字的由來(lái):HTTP + 。如果我們用日常生活中的交流來(lái)模擬 HTTP,那么明文的聊天可能是這樣的:致少數(shù)派:我叫李明,我的密碼是 ;我最近收到了什么新的私信?答復(fù):李明你好,已確認(rèn)你的身份。昨天張三給你發(fā)了一條私信,內(nèi)容是「天氣真好」。問(wèn)題在于,你和少數(shù)派并不是面對(duì)面交流的。事實(shí)上,你跟少數(shù)派說(shuō)的每一句話,都像一張明信片一樣,郵局拿到你的明信片,中間經(jīng)過(guò)一層層的郵政網(wǎng)點(diǎn)轉(zhuǎn)發(fā),最終才派送到少數(shù)派那兒。少數(shù)派給你的答復(fù)也是如此。這樣就帶來(lái)至少以下這些風(fēng)險(xiǎn):
明信片嘛,所有郵遞員都可以看到,所以大家不但知道了你的私信內(nèi)容,大家甚至知道了你的姓名和密碼
你雖然收到了一個(gè)答復(fù),但是你無(wú)法確定到底是不是少數(shù)派給出的。萬(wàn)一哪個(gè)郵遞員懶得(或者故意不去)送你的明信片,而自己隨便寫(xiě)了一條私信回給你呢?
郵遞員完成了派送,也成功取回了少數(shù)派給你的答復(fù)。但是少數(shù)派回復(fù)的私信內(nèi)容明明是「天氣真好」,有個(gè)搗蛋的郵遞員把它改成了「天氣真不好」▍HTTPS 的互相問(wèn)候引入 HTTPS 之后電腦瀏覽器出現(xiàn)安全證書(shū)有問(wèn)題,情況就完全不一樣了。雖然仍然使用明信片進(jìn)行交流,但是這次,你和少數(shù)派之間首先有個(gè)見(jiàn)面的問(wèn)候:致少數(shù)派:我需要訪問(wèn)私信;我懂得使用 算法、 算法,你選一個(gè);我生成了一個(gè)隨機(jī)數(shù),11872當(dāng)然,實(shí)際使用時(shí)的信息會(huì)再多一些,這里只選取了其中最重要的幾個(gè)。它們分別是:
所需訪問(wèn)的網(wǎng)站
我所支持的算法
我生成的隨機(jī)數(shù)少數(shù)派拿到你的信息之后,會(huì)根據(jù)自身情況做出答復(fù):答復(fù):我們就用 算法吧;我也生成了一個(gè)隨機(jī)數(shù),;給你私信網(wǎng)站的證書(shū)(一個(gè)文件袋)少數(shù)派給的答復(fù)也比我所舉的例子復(fù)雜得多,這里選取的幾項(xiàng)分別是:
從你所給的幾種算法中挑了一種,雙方都合適的
也生成了一個(gè)隨機(jī)數(shù)
給了你所需網(wǎng)站的證書(shū)HTTPS 的安全通道尚未建立,但是我們有必要先來(lái)看一下這張證書(shū)。▍證書(shū),一個(gè)文件袋經(jīng)過(guò)和少數(shù)派的第一次通信,你擁有了一張證書(shū);或者說(shuō)是一個(gè)文件袋,里面裝滿了各種文件,可供查驗(yàn)和使用。你可以在任何瀏覽器中看到這張證書(shū)。
例如,使用 打開(kāi)少數(shù)派網(wǎng)站電腦瀏覽器出現(xiàn)安全證書(shū)有問(wèn)題,地址欄的左側(cè)會(huì)出現(xiàn)一把小鎖。點(diǎn)擊之后,可以查看證書(shū)的詳細(xì)情況。
這張證書(shū)主要包含以下信息:
證書(shū)頒給了哪個(gè)或哪些網(wǎng)站(使用者)
證書(shū)的有效期的起止時(shí)間(有效期)
一個(gè)公鑰
證書(shū)是由誰(shuí)頒發(fā)的(頒發(fā)者)接下來(lái),你會(huì)一一對(duì)這些信息進(jìn)行處理。第一項(xiàng)很好理解,使用者,就是這張證書(shū)對(duì)誰(shuí)有效。你看了一眼,嗯,*.,這是一個(gè)通配符域名,意思就是對(duì)所有 的域名都有效。好的,它確實(shí)符合少數(shù)派網(wǎng)站的網(wǎng)址,驗(yàn)證通過(guò)。第二項(xiàng),有效期,也很容易。你在自己的電腦上查了一下時(shí)間,2021年8月,確實(shí)是在有效期區(qū)間內(nèi),好的,驗(yàn)證通過(guò)。第三項(xiàng)是一個(gè)公鑰,先存下來(lái)后面用。第四項(xiàng),頒發(fā)者,雖然你知道了這張證書(shū)是由一個(gè)叫做 TLS DV RSA Mixed 2020 CA-1 的人頒發(fā)的,但是,這個(gè)人又是誰(shuí)?他值得信任嗎?
這就要看證書(shū)中的最后一項(xiàng)內(nèi)容,證書(shū)路徑。在這里,我們可以通過(guò)一個(gè)樹(shù)形圖,清晰地看到我們當(dāng)前這個(gè)證書(shū)的信任鏈。對(duì)于列表中的每一項(xiàng),都可以通過(guò)右下方「查看證書(shū)」按鈕,讀取到這一項(xiàng)的證書(shū)信息。也就是說(shuō),列表中的每一項(xiàng),其實(shí)都是一張完整的證書(shū)。在這個(gè)例子中:因此,隨著一層層的信任關(guān)系,你也就信任了 *. 這張證書(shū);這種信任帶來(lái)的最重要的意義在于——你相信,證書(shū)中包含的那個(gè)「公鑰」確實(shí)是屬于少數(shù)派的,而不是其中任何一個(gè)郵差偽造的。所以,證書(shū)帶來(lái)的結(jié)果就是,你擁有了一個(gè)確信是少數(shù)派的公鑰。▍HTTPS 的初次加密嘗試公鑰就像是從證書(shū)這個(gè)文件袋中捎過(guò)來(lái)的一個(gè)信封,一旦封口,就只有證書(shū)擁有者使用私鑰才可以打開(kāi);換言之,你只要用這個(gè)信封寄送,那么就只有少數(shù)派可以讀到。(啊,用于封口的是一種神奇的膠水,這是由數(shù)學(xué)原理保證的)所以你可以放心地使用從證書(shū)中找到的這枚公鑰。你決定試一下這枚公鑰。于是你又生成了一個(gè)隨機(jī)數(shù) 36721,寫(xiě)在明信片上,興致勃勃地把明信片裝進(jìn)了信封,仔細(xì)地封好口子。【這是只有你和少數(shù)派才可以看到的內(nèi)容】現(xiàn)在,你交給郵局的不再是「衣不蔽體」的明信片,而是一個(gè)信封。郵差看不到信件的內(nèi)容,他只知道這封信送往何處。少數(shù)派成功收到了這封信,并使用少數(shù)派的私鑰拆開(kāi)了信封;最后一個(gè)隨機(jī)數(shù)成功送達(dá)。整理一下。結(jié)合前面的「問(wèn)候」過(guò)程,現(xiàn)在你和少數(shù)派雙方手上擁有:
一個(gè)雙方都認(rèn)可的加密算法 ,郵差可以偷看
一個(gè)少數(shù)派生成的隨機(jī)數(shù) ,郵差可以偷看
一個(gè)你生成的隨機(jī)數(shù) 11872,郵差可以偷看
另一個(gè)你生成的隨機(jī)數(shù) 36721,只有你和少數(shù)派知道通過(guò)這些信息,你和少數(shù)派會(huì)各自使用三個(gè)隨機(jī)數(shù)和算法,計(jì)算出一個(gè)稱為「會(huì)話密鑰」的密碼。由于隨機(jī)數(shù)和算法都已經(jīng)確定,因此你和少數(shù)派計(jì)算出的「會(huì)話密鑰」必然是一致的;假設(shè)這個(gè)計(jì)算出來(lái)的密碼是 。你們事實(shí)上完成了一件很有意思的事情:在所有聊天內(nèi)容都會(huì)被人偷看的情況下,你們成功交換了密碼;這使得后續(xù)的秘密聊天成為可能。交換密鑰的方法還有很多,這里僅僅展示了其中的一種。▍愉快的秘密通信好了,最后,你們可以使用前面制作的 這個(gè)密碼來(lái)進(jìn)行后面的聊天。而這個(gè)密碼用起來(lái)就方便多了,只要雙方通過(guò)一個(gè)帶密碼鎖的小盒子來(lái)互相通信,那路上的郵差就肯定打不開(kāi)。暴力解鎖?密碼復(fù)雜度保證了即使用人類最頂級(jí)的計(jì)算機(jī),也無(wú)法在有生之年把密碼猜出來(lái)。( 這只是個(gè)例子,實(shí)際使用當(dāng)然不可能這么短?。┠惆严雴?wèn)的問(wèn)題(我的私信?)塞進(jìn)了密碼鎖,并把密碼鎖的密碼設(shè)為 ,鎖上之后打亂密碼鎖。少數(shù)派拿到了這個(gè)密碼鎖,通過(guò) 解開(kāi)密碼鎖。同樣的,少數(shù)派會(huì)把你的私信內(nèi)容也用 鎖上,寄回給你。最后,你還是用 解鎖私信內(nèi)容,秘密通信順利完成。再來(lái)回頭看看最開(kāi)始 HTTP 遇到幾個(gè)風(fēng)險(xiǎn),在 HTTPS 中是如何解決的:
郵差知道了你的私信內(nèi)容、姓名和密碼:在 HTTPS 中,由于通信使用 這個(gè)密碼鎖來(lái)加密,所以路上的郵差不可能知道信件的內(nèi)容
無(wú)法確定到底是不是少數(shù)派給出的答復(fù):在 HTTPS 中,證書(shū)的信任鏈保證了「公鑰」的可信度,而公鑰和私鑰的匹配認(rèn)證了少數(shù)派的身份
搗蛋的郵遞員修改了信件內(nèi)容:在 HTTPS 中,由于使用了密碼鎖,郵差讀不了郵件,也無(wú)法寫(xiě)入信件所以通過(guò)這稍顯復(fù)雜的 HTTPS 通道,我們最終解決了 HTTP 的一些風(fēng)險(xiǎn)。▍HTTPS 已隨處可見(jiàn)現(xiàn)在,幾乎所有主流的瀏覽器都已經(jīng)用比較強(qiáng)烈的視覺(jué)效果區(qū)分了 HTTP 和 HTTPS 網(wǎng)站。例如 ,訪問(wèn)少數(shù)派網(wǎng)站時(shí),地址欄前方的標(biāo)識(shí)是一把寓示著安全的小鎖,點(diǎn)開(kāi)則提示「連接是安全的」: