為什么 HTTPS 是安全的?
來自:https://segmentfault.com/a/1190000023936425
作者:mokeyWie
1. HTTP 協(xié)議
在談論 HTTPS 協(xié)議之前,先來回顧一下 HTTP 協(xié)議的概念。
1.1 HTTP 協(xié)議介紹
HTTP 協(xié)議是一種基于文本的傳輸協(xié)議,它位于 OSI 網絡模型中的應用層。

HTTP 協(xié)議是通過客戶端和服務器的請求應答來進行通訊,目前協(xié)議由之前的 RFC 2616 拆分成立六個單獨的協(xié)議說明(RFC 7230、RFC 7231、RFC 7232、RFC 7233、RFC 7234、RFC 7235),通訊報文如下:
請求
POST http://www.baidu.com HTTP/1.1Host: www.baidu.comConnection: keep-aliveContent-Length: 7User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36wd=HTTP
響應
HTTP/1.1 200 OKConnection: Keep-AliveContent-Encoding: gzipContent-Type: text/html;charset=utf-8Date: Thu, 14 Feb 2019 07:23:49 GMTTransfer-Encoding: chunked...
1.2 HTTP 中間人攻擊
HTTP 協(xié)議使用起來確實非常的方便,但是它存在一個致命的缺點:不安全。
我們知道 HTTP 協(xié)議中的報文都是以明文的方式進行傳輸,不做任何加密,這樣會導致什么問題呢?下面來舉個例子:
小明在 JAVA 貼吧發(fā)帖,內容為我愛JAVA:

被中間人進行攻擊,內容修改為我愛PHP

小明被群嘲
可以看到在 HTTP 傳輸過程中,中間人能看到并且修改 HTTP 通訊中所有的請求和響應內容,所以使用 HTTP 是非常的不安全的。
1.3 防止中間人攻擊
這個時候可能就有人想到了,既然內容是明文那我使用對稱加密的方式將報文加密這樣中間人不就看不到明文了嗎,于是如下改造:
雙方約定加密方式

使用 AES 加密報文




2. HTTPS 協(xié)議
2.1 HTTPS 簡介

2.2 CA 認證體系
上一節(jié)我們看到客戶端需要對服務器返回的 SSL 證書進行校驗,那么客戶端是如何校驗服務器 SSL 證書的安全性呢。
權威認證機構
在 CA 認證體系中,所有的證書都是由權威機構來頒發(fā),而權威機構的 CA 證書都是已經在操作系統(tǒng)中內置的,我們把這些證書稱之為CA根證書:

簽發(fā)證書
我們的應用服務器如果想要使用 SSL 的話,需要通過權威認證機構來簽發(fā)CA證書,我們將服務器生成的公鑰和站點相關信息發(fā)送給CA簽發(fā)機構,再由CA簽發(fā)機構通過服務器發(fā)送的相關信息用CA簽發(fā)機構進行加簽,由此得到我們應用服務器的證書,證書會對應的生成證書內容的簽名,并將該簽名使用CA簽發(fā)機構的私鑰進行加密得到證書指紋,并且與上級證書生成關系鏈。
這里我們把百度的證書下載下來看看:


這里有趣的是,證書校驗用的 RSA 是通過私鑰加密證書簽名,公鑰解密來巧妙的驗證證書有效性。
這樣通過證書的認證體系,我們就可以避免了中間人竊取AES_KEY從而發(fā)起攔截和修改 HTTP 通訊的報文。
總結
首先先通過對 HTTP 中間人攻擊的來了解到 HTTP 為什么是不安全的,然后再從安全攻防的技術演變一直到 HTTPS 的原理概括,希望能讓大家對 HTTPS 有個更深刻的了解。
回復下方「關鍵詞」,獲取優(yōu)質資源 回復關鍵詞「python」,立即獲取進階必備書籍《Python進階》電子版 回復關鍵詞「Flask」,立即獲取Flask?教程 回復關鍵詞「wx」,加入高質量python交流群 推薦:
長按關注公眾號
每天分享python技術干貨
