加入咱們一塊兒學習,每天進步html
1. HTTP 協議
1.1 HTTP 協議介紹
應用層
。
![](http://static.javashuo.com/static/loading.gif)
-
請求
POST http://www.baidu.com HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Content-Length: 7
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
wd=HTTP
-
響應
HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html;charset=utf-8
Date: Thu, 14 Feb 2019 07:23:49 GMT
Transfer-Encoding: chunked
<html>...</html>
1.2 HTTP 中間人攻擊
不安全
。
-
小明在 JAVA 貼吧發帖,內容爲 我愛JAVA
:
-
被中間人進行攻擊,內容修改成 我愛PHP
-
小明被羣嘲(手動狗頭)
1.3 防止中間人攻擊
對稱加密
的方式將報文加密這樣中間人不就看不到明文了嗎,因而以下改造:
-
雙方約定加密方式
-
使用 AES 加密報文
![](http://static.javashuo.com/static/loading.gif)
非對稱加密
,咱們能夠經過 RSA 算法來實現。
公私鑰
,服務器將
公鑰
返回給客戶端,客戶端本地生成一串祕鑰(
AES_KEY
)用於
對稱加密
,並經過服務器發送的
公鑰
進行加密獲得(
AES_KEY_SECRET
),以後返回給服務端,服務端經過
私鑰
將客戶端發送的
AES_KEY_SECRET
進行解密獲得
AEK_KEY
,最後客戶端和服務器經過
AEK_KEY
進行報文的加密通信,改造以下:
![](http://static.javashuo.com/static/loading.gif)
AES加密
的祕鑰,因此對於後續的通信是確定沒法進行解密了,那麼這樣作就是絕對安全了嗎?
AES_KEY
,那我就把本身模擬成一個客戶端和服務器端的結合體,在
用戶->中間人
的過程當中中間人模擬服務器的行爲,這樣能夠拿到用戶請求的明文,在
中間人->服務器
的過程當中中間人模擬客戶端行爲,這樣能夠拿到服務器響應的明文,以此來進行中間人攻擊:
![](http://static.javashuo.com/static/loading.gif)
AES_KEY
,在拿到
AES_KEY
以後就能輕鬆的進行解密了。
2. HTTPS 協議
2.1 HTTPS 簡介
SSL+HTTP
的簡稱,固然如今
SSL
基本已經被
TLS
取代了,不過接下來咱們仍是統一以
SSL
做爲簡稱,
SSL
協議其實不止是應用在
HTTP
協議上,還在應用在各類應用層協議上,例如:
FTP
、
WebSocket
。
SSL
協議大體就和上一節
非對稱加密
的性質同樣,握手的過程當中主要也是爲了交換祕鑰,而後再通信過程當中使用
對稱加密
進行通信,大概流程以下:
![](http://static.javashuo.com/static/loading.gif)
公鑰
,客戶端會對 SSL 證書進行驗證,其中證書認證體系就是確保
SSL
安全的關鍵,接下來咱們就來說解下
CA 認證體系
,看看它是如何防止中間人攻擊的。
2.2 CA 認證體系
-
權威認證機構前端
在 CA 認證體系中,全部的證書都是由權威機構來頒發,而權威機構的 CA 證書都是已經在操做系統中內置的,咱們把這些證書稱之爲
CA根證書
:web -
簽發證書面試
咱們的應用服務器若是想要使用 SSL 的話,須要經過權威認證機構來簽發
CA證書
,咱們將服務器生成的公鑰和站點相關信息發送給CA簽發機構
,再由CA簽發機構
經過服務器發送的相關信息用CA簽發機構
進行加簽,由此獲得咱們應用服務器的證書,證書會對應的生成證書內容的簽名
,並將該簽名
使用CA簽發機構
的私鑰進行加密獲得證書指紋
,而且與上級證書生成關係鏈。算法這裏咱們把百度的證書下載下來看看:瀏覽器
![](http://static.javashuo.com/static/loading.gif)
GlobalSign G2
,一樣的
GlobalSign G2
是受信於
GlobalSign R1
,當客戶端(瀏覽器)作證書校驗時,會一級一級的向上作檢查,直到最後的
根證書
,若是沒有問題說明
服務器證書
是能夠被信任的。
-
如何驗證服務器證書安全
那麼客戶端(瀏覽器)又是如何對
服務器證書
作校驗的呢,首先會經過層級關係找到上級證書,經過上級證書裏的公鑰
來對服務器的證書指紋
進行解密獲得簽名(sign1)
,再經過簽名算法算出服務器證書的簽名(sign2)
,經過對比sign1
和sign2
,若是相等就說明證書是沒有被篡改
也不是僞造
的。服務器
![](http://static.javashuo.com/static/loading.gif)
AES_KEY
從而發起攔截和修改 HTTP 通信的報文。
總結
最後
![](http://static.javashuo.com/static/loading.gif)
本文分享自微信公衆號 - 前端瓶子君(pinzi_com)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。微信