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