從東東的成長(zhǎng)史看 HTTPS 和SSH的取向
東東想要訪問(wèn) xx 網(wǎng)站,底層的網(wǎng)絡(luò)都架設(shè)好了:
鏈路層把網(wǎng)絡(luò)從物理上鏈接起來(lái)。
網(wǎng)絡(luò)層根據(jù) IP 的路由規(guī)則可以從東東的主機(jī)導(dǎo)航到 xx 服務(wù)器的主機(jī)。
傳輸層從東東的瀏覽器進(jìn)程傳輸數(shù)據(jù)到服務(wù)器的 xx 服務(wù)進(jìn)程。
然后應(yīng)用層就是解析 http 內(nèi)容,做不同的處理和展示了。
基于這些網(wǎng)絡(luò)的基礎(chǔ)設(shè)施,東東就可以訪問(wèn)他喜歡看的 xx 網(wǎng)站了。
但是東東想在 xx 網(wǎng)站上存儲(chǔ)一些自己的數(shù)據(jù),那得加一個(gè)自己的標(biāo)識(shí)吧,也就是用戶名,還得加個(gè)密碼來(lái)證明這是自己。
創(chuàng)建這個(gè)標(biāo)識(shí)的過(guò)程就是注冊(cè),而證明這個(gè)標(biāo)識(shí)是自己的過(guò)程就是登陸。
但是過(guò)了一段時(shí)間,東東就發(fā)現(xiàn)不對(duì)勁了,隔壁的小王怎么知道自己看了 xx 網(wǎng)站呢?
他肯定半路截胡了,或者看到了我的用戶名密碼,或者看到了我訪問(wèn)的內(nèi)容。
怎么辦呢?
加密!
我把內(nèi)容放到箱子里鎖起來(lái)傳過(guò)去,那邊用對(duì)應(yīng)的鑰匙就能打開(kāi)。別人沒(méi)有鑰匙就看不了內(nèi)容。這種鑰匙叫對(duì)稱鑰匙。
但是怎么把鑰匙傳過(guò)去還不被別人知道呢?
東東陷入了思考。
這時(shí)候光光給他介紹了一把神奇的鎖。這把鎖開(kāi)鎖和解鎖要用不同的鑰匙,叫非對(duì)稱鑰匙,說(shuō)是可以解決問(wèn)題。
東東想了一會(huì),對(duì)哦,如果開(kāi)鎖和解鎖用不同的鑰匙,那 xx 服務(wù)器只要把一把鑰匙給我就好了,我把內(nèi)容放進(jìn)去,只有他能解鎖。
這樣就解決了對(duì)稱鑰匙傳遞的難題,之后對(duì)方拿到鑰匙就可以進(jìn)行加密的通信了。
后來(lái)東東才知道這種加密技術(shù)叫做 RSA,可以生成兩把密鑰。
把一個(gè)密鑰留下,一個(gè)密鑰公開(kāi)。
留下的密鑰自有自己有,叫做私鑰。
公開(kāi)的密鑰所有人都可以拿到,叫做公鑰。
公鑰加密只有私鑰能解密,私鑰加密只有公鑰能解密。
因?yàn)楣€是公開(kāi)的,別人加密了只有我能解密,這種叫做加密。
私鑰是只有我一個(gè)人有,我加密了,別人都能揭秘,但都知道是我加密的,能證明我的身份,這種叫做簽名。
加密和簽名分別用來(lái)解決不同的問(wèn)題。
回到東東的問(wèn)題,世界上有那么多帶鎖的箱子和公鑰,我怎么知道這個(gè)箱子和公鑰就是 xx 服務(wù)器給我的呢?
要是有一個(gè)權(quán)威機(jī)構(gòu)能鑒別公鑰的真?zhèn)尉秃昧恕?/p>
這個(gè)機(jī)構(gòu)就叫做 CA,專門(mén)用于鑒別公鑰真?zhèn)蔚模贿@個(gè)機(jī)構(gòu)認(rèn)證為真的公鑰就被稱作數(shù)字證書(shū)。
現(xiàn)在東東的電腦上保存了信任哪些 CA,然后訪問(wèn) xx 網(wǎng)站的時(shí)候,就會(huì)拿到它的數(shù)字證書(shū),對(duì)比了一下,是我信任的 CA 頒發(fā)的。那就把對(duì)稱密鑰傳給他好了,之后我們用對(duì)稱密鑰來(lái)加密通信的消息。
之后,東東就能愉快的訪問(wèn) xx 網(wǎng)站,而不用擔(dān)心隔壁小王的窺探了。
理一下其中的技術(shù):
最核心的是非對(duì)稱加密用的 RSA 算法,可以生成兩把密鑰,分別作為公私鑰,用來(lái)加密和簽名,通過(guò)這種方式傳遞對(duì)稱密鑰,之后進(jìn)行信息的加密傳輸。公鑰還需要鑒別下真?zhèn)危@個(gè)是 CA 做的,那個(gè)是存在計(jì)算機(jī)里的可信任的機(jī)構(gòu),他們認(rèn)證的公鑰叫做數(shù)字證書(shū)。
那這種技術(shù)是在網(wǎng)絡(luò)的哪一層呢?
進(jìn)程到進(jìn)程的加密傳輸,明顯是傳輸層,這種協(xié)議叫做 SSL。發(fā)布了 1.0、2.0、3.0 的版本后,發(fā)現(xiàn)了個(gè) bug,后來(lái)修復(fù)了,感覺(jué)改動(dòng)比較大,就改了個(gè)名字叫 TSL。
再上層就是 http 來(lái)訪問(wèn)網(wǎng)站內(nèi)容了。
所以這種安全的通信是 SSL + HTTP 或者叫 TLS + HTTP,合起來(lái)叫做 https。
CA 認(rèn)證的證書(shū)也就可以叫做 https 數(shù)字證書(shū)、ssl 數(shù)字證書(shū)、tls 數(shù)字證書(shū)等等。
后來(lái)東東做了程序員,不只是通過(guò)網(wǎng)頁(yè)瀏覽 xx 網(wǎng)站的網(wǎng)頁(yè),更要鏈接到服務(wù)器上去執(zhí)行一些腳本,專業(yè)了不少。
和訪問(wèn) xx 網(wǎng)站一樣,同樣要登陸,那還可以用 https 么?
不行,不是每個(gè)網(wǎng)站都找 CA 認(rèn)證一遍的,不然內(nèi)部那么多服務(wù)器,都認(rèn)證一邊才能訪問(wèn)么?
所以簡(jiǎn)化一下,xx 服務(wù)器把公鑰直接給我,讓我自己選擇是否信任:
這樣我只要信任了公鑰就可以證明是 xx 服務(wù)器,然后把用戶名密碼傳過(guò)去,那邊驗(yàn)證下,就可以登陸服務(wù)器了。這叫做 ssh 協(xié)議。
看起來(lái)和 https 沒(méi)多大差別,只不過(guò)公鑰不需要 CA 認(rèn)證了。
這還不夠,每次還要輸入用戶名密碼多麻煩,怎么能不輸入密碼就能證明我的身份呢?
東東想起來(lái) RSA 的私鑰可以用來(lái)簽名,那我把公鑰給 xx 服務(wù)器,通過(guò)私鑰加密一段隨機(jī)的內(nèi)容,他能解開(kāi)不就是證明了我是我么?
所以東東改進(jìn)了下 ssh 協(xié)議,不是信任了服務(wù)器的公鑰就傳用戶名和密碼過(guò)去了, 而是服務(wù)器返回一段隨機(jī)數(shù),我這邊用我的私鑰加密下這段隨機(jī)數(shù)(也就是簽個(gè)名),那邊能解開(kāi)就證明了我是我。
私鑰簽名能達(dá)到證明身份的目的,那還用啥用戶名密碼呢,而且還更安全。
就這樣,東東就可以免密登陸 xx 服務(wù)器執(zhí)行各種命令了。
只是剛開(kāi)始的時(shí)候需要在本地生成公私鑰,把公鑰告訴 xx 網(wǎng)站就行了。
回想一路以來(lái)用到的 htts 和 ssh,雖然都是基于公私密鑰,但確實(shí)是有一些區(qū)別的:
- https 的取向是面向普通用戶的,他們是通過(guò)用戶名和密碼認(rèn)證身份的,只需要瀏覽器上同意下數(shù)字證書(shū),就可以拿到對(duì)稱密鑰,然后加密通信的數(shù)據(jù),對(duì)于普通用戶來(lái)說(shuō),只不過(guò)在瀏覽器地址欄多了個(gè)小鑰匙的圖標(biāo),其他的感覺(jué)不到。
- ssh 的取向是針對(duì)專業(yè)用戶的,他們既可以通過(guò)用戶名和密碼認(rèn)證身份,還可以通過(guò)一套公私鑰來(lái)認(rèn)證身份,而且服務(wù)器比較多,不需要 CA 認(rèn)證,打在控制臺(tái)自己看一下就行。通過(guò)私鑰簽名取代了用戶名密碼,還能夠免密登陸。
其實(shí)區(qū)別就兩個(gè),一個(gè)是公鑰是否 CA 認(rèn)證,一個(gè)是認(rèn)證身份使用用戶名密碼還是公私鑰。
當(dāng)然,他們用于的目的也不同,一個(gè)是網(wǎng)頁(yè)的安全瀏覽的,一個(gè)是遠(yuǎn)程執(zhí)行命令的。
https 和 ssh 因?yàn)椴煌娜∠颍?RSA 的公私鑰機(jī)制的基礎(chǔ)上,發(fā)展成了不同的協(xié)議。東東也從普通的電腦用戶成長(zhǎng)為了一名專業(yè)的程序員。