我終於搞清了啥是 HTTPS 了

引言

最近上海連續下了一週雨,溫度一晚上之間回到解放前,穿夏裝的我被凍得瑟瑟發抖,躲在家裏哪也不想去。算法

在家百無聊賴的刷着網頁,看到公衆號後臺的留言,有同窗問我 HTTP 和 HTTPS 有啥區別?api

這還用問,固然是 HTTPS 要比 HTTP 更加的安全啊,沒看到後面帶着個 S 呢麼,帶着 S 就這麼 NB 。瀏覽器

而後同窗的下一個問題把我問懵逼了,爲啥帶 S 的更安全呢?能詳細的講講麼。安全

我跟你講嗷,不是我吹,我這麼多年。。。。。。服務器

就沒見過你這麼刨根究底的同窗,老問這種我也不是很清楚的問題。網絡

雖然這個問題問的我老臉一紅,可是我有一種不要臉的精神 「我不會,可是我能夠學」 。性能

HTTP

首先先來了解下 HTTP :加密

HTTP 協議全稱爲:Hyper Text Transfer Protocol ,翻譯過來就是超文本傳輸協議,請不要質疑這個翻譯,我專門用百度翻譯翻了一下。.net

TCP/IP 四層模型應該都知道的,有數據鏈路層,網絡層,傳輸層和應用層:翻譯

而 HTTP 協議就是位於 TCP/IP 四層模型的應用層上。

這裏不少人都會混淆 TCP 和 HTTP ,實際上 HTTP 是基於 TCP 鏈接基礎上的。

簡單的說, TCP 就是單純創建鏈接,不涉及任何咱們須要請求的實際數據,簡單的傳輸。而 HTTP 是用來收發數據,即實際應用上來的。

HTTP 協議經過請求和響應在客戶端和服務端之間收發數據,進行通訊:

HTTPS

HTTP 協議看起來好像沒啥問題,惟一的問題就是不夠安全,由於 HTTP 協議的傳輸方式徹底是由明文傳輸的,不作任何加密,這就讓一些不懷好意的人有了可乘之機。

這種傳輸方式誘發了一種經典的攻擊方式:中間人攻擊。

對於這種狀況,最簡單的咱們可使用加密方案,好比使用 AES 加密,服務端和客戶端先約定一個隨機生成的密鑰 key ,後續的通訊中,全部的信息都使用這個密鑰進行 AES 加密:

這樣雖而後面的通訊過程安全了,可是咱們在第一發送 AES 密鑰的時候仍是存在被中間人攔截的風險,一旦中間人攔截到咱們的密鑰,可用對密鑰進行更換或者直接解密請求內容:

這時咱們可使用不對稱加密,來專門對密鑰的傳輸作一次額外的保護。

不對稱加密會有兩個密鑰,一個是公鑰,一個是私鑰。明文可使用公鑰加密私鑰解密,也可使用私鑰加密公鑰解密。

如今比較通用的非對稱加密算法有 RSA 。

看到這裏的同窗必定在奇怪,既然都使用了不對稱加密,爲啥只對 AES 的密鑰作不對稱加密,好像有畫蛇添足,徹底能夠對後續全部的通訊信息全都使用不對稱加密。

由於不對稱加密相比較對稱加密性能上存在明顯的劣勢,可能你以爲在一個請求中多消耗幾 ms 或者幾 ns 無所謂,可是請求到達服務端是要進行解密,每一個請求都多消耗幾 ms 累計起來仍是很是可觀的。

上面這個方案看起來已經很安全了,中間人即便攔截到咱們的公鑰,因爲不知道咱們的私鑰貌似也沒辦法解密。

實際上中間人徹底不須要解密咱們的信息,他能夠生成一對新的公私鑰發送給客戶端進行攻擊,後續客戶端的通訊中間人使用本身創造的私鑰進行解密,而後經過服務端生成的公鑰進行加密返回給服務端:

CA 證書

上面的問題咱們僅經過客戶端和服務端已經沒辦法了,這時候須要引入新的第三方機構,一個頒發 CA 證書的機構。

常見的第三方 CA 機構有:Symantec(賽門鐵克),Comodo(科莫多),GeoTrust(環度網信),GoDaddy,Thawte,daoRapidSSL 等等。

在中間人攻擊中,咱們遇到的問題不是加密算法不夠神奇,不是密鑰方式不夠嚴謹,而是咱們沒有辦法向咱們的客戶端代表咱們給他的公鑰是咱們的,是否是很像我沒辦法證實我是個人問題。

因此第三方機構應運而生,第三方機構只作一件事情,將服務端的公鑰刻上了咱們的名字(CA 證書),客戶端接收到公鑰以後,只須要來第三方機構這裏查詢,就能知道這個公鑰是否是真的服務器,而後再將本身生成的 AES 密鑰使用 CA 證書中解密獲得的公鑰進行加密後發送給服務端。

最後服務端使用私鑰解密獲得 AES 密鑰,就能夠愉快的和客戶端進行通訊了。

最後的最後,CA 機構驗證不是每次都要去 CA 機構查詢。這樣作太傻了並且太耗時,尤爲是不少 CA 機構的服務都在海外,這樣一來一去消耗的時間太多了。

CA 機構高明的地方就在於,咱們去找它註冊公鑰,它會使用另外一個來註冊的公司的私鑰對咱們的公鑰加密,獲得一個咱們的公鑰的指紋(全球惟一),而後將這家公司的公鑰信息(其實也是證書)和咱們的公鑰以及咱們公鑰的指紋打包成一個證書。

當咱們使用 HTTPS 將證書下發給客戶端校驗時,客戶端(好比瀏覽器)從證書中看到了上級證書的信息,恰巧這個證書就在瀏覽器(或者本機)中,已經被驗證過是合法的,瀏覽器只要使用這個證書中的公鑰將咱們的公鑰指紋進行解密,而後比對咱們的公鑰信息就知道咱們也是的合法的。由於假證書中的公鑰簽名不可能被合法的上級證書中公鑰解密 。

這段稍微有點繞,慢慢看多看幾回就理解了。

參考

https://www.jianshu.com/p/691b8ba3a70f

https://blog.csdn.net/u010144805/article/details/80803059

http://www.javashuo.com/article/p-akjixxbi-cy.html

相關文章
相關標籤/搜索