HTTP到HTTPS的發展歷史
### 什么是HTTP?
> 超文本傳輸協議,是一個基于請求與響應,無狀態的,應用層的協議,常基于TCP/IP協議傳輸數據,互聯網上應用最為廣泛的一種網絡協議,所有的WWW文件都必須遵守這個標準。設計HTTP的初衷是為了提供一種發布和接收HTML頁面的方法。
#### 發展歷史
| 版本 | 產生時間 | 內容 | 發展現狀 |
| --- | --- | --- | --- |
| HTTP/0.9 | 1991年 | 不涉及數據包傳輸,規定客戶端和服務器之間通信格式,只能GET請求 | 沒有作為正式的標準 |
| HTTP/1.0 | 1996年 | 傳輸內容格式不限制,增加PUT、PATCH、HEAD、 OPTIONS、DELETE命令 | 正式作為標準 |
| HTTP/1.1 | 1997年 | 持久連接(長連接)、節約帶寬、HOST域、管道機制、分塊傳輸編碼 | 2015年前使用最廣泛 |
| HTTP/2 | 2015年 | 多路復用、服務器推送、頭信息壓縮、二進制協議等 | 逐漸覆蓋市場 |

這個Akamai公司建立的一個官方的演示,使用HTTP/1.1和HTTP/2同時請求379張圖片,觀察請求的時間,明顯看出HTTP/2性能占優勢。

多路復用:通過單一的HTTP/2連接請求發起多重的請求-響應消息,多個請求stream共享一個TCP連接,實現多留并行而不是依賴建立多個TCP連接。
#### HTTP報文格式

### 什么是HTTPS?
> 《圖解HTTP》這本書中曾提過HTTPS是身披SSL外殼的HTTP。HTTPS是一種通過計算機網絡進行安全通信的傳輸協議,經由HTTP進行通信,利用SSL/TLS建立全信道,加密數據包。HTTPS使用的主要目的是提供對網站服務器的身份認證,同時保護交換數據的隱私與完整性。
> PS:TLS是傳輸層加密協議,前身是SSL協議,由網景公司1995年發布,有時候兩者不區分。
## 三、HTTP VS HTTPS
### HTTP特點
1. 無狀態:協議對客戶端沒有狀態存儲,對事物處理沒有“記憶”能力,比如訪問一個網站需要反復進行登錄操作
2. 無連接:HTTP/1.1之前,由于無狀態特點,每次請求需要通過TCP三次握手四次揮手,和服務器重新建立連接。比如某個客戶機在短時間多次請求同一個資源,服務器并不能區別是否已經響應過用戶的請求,所以每次需要重新響應請求,需要耗費不必要的時間和流量。
3. 基于請求和響應:基本的特性,由客戶端發起請求,服務端響應
4. 簡單快速、靈活
5. 通信使用明文、請求和響應不會對通信方進行確認、無法保護數據的完整性
### HTTPS特點
基于HTTP協議,通過SSL或TLS提供加密處理數據、驗證對方身份以及數據完整性保護
通過抓包可以看到數據不是明文傳輸,而且HTTPS有如下特點:
1. 內容加密:采用混合加密技術,中間者無法直接查看明文內容
2. 驗證身份:通過證書認證客戶端訪問的是自己的服務器
3. 保護數據完整性:防止傳輸的內容被中間人冒充或者篡改
> 混合加密:結合非對稱加密和對稱加密技術。客戶端使用對稱加密生成密鑰對傳輸數據進行加密,然后使用非對稱加密的公鑰再對秘鑰進行加密,所以網絡上傳輸的數據是被秘鑰加密的密文和用公鑰加密后的秘密秘鑰,因此即使被黑客截取,由于沒有私鑰,無法獲取到加密明文的秘鑰,便無法獲取到明文數據。
>
> 數字摘要:通過單向hash函數對原文進行哈希,將需加密的明文“摘要”成一串固定長度(如128bit)的密文,不同的明文摘要成的密文其結果總是不相同,同樣的明文其摘要必定一致,并且即使知道了摘要也不能反推出明文。
>
> 數字簽名技術:數字簽名建立在公鑰加密體制基礎上,是公鑰加密技術的另一類應用。它把公鑰加密技術和數字摘要結合起來,形成了實用的數字簽名技術。
* 收方能夠證實發送方的真實身份;
* 發送方事后不能否認所發送過的報文;
* 收方或非法者不能偽造、篡改報文。
非對稱加密過程需要用到公鑰進行加密,那么公鑰從何而來?其實公鑰就被包含在數字證書中,數字證書通常來說是由受信任的數字證書頒發機構CA,在驗證服務器身份后頒發,證書中包含了一個密鑰對(公鑰和私鑰)和所有者識別信息。數字證書被放到服務端,具有服務器身份驗證和數據傳輸加密功能。
## 五、HTTPS實現原理
### SSL建立連接過程
1. client向server發送請求https://baidu.com,然后連接到server的443端口,發送的信息主要是隨機值1和客戶端支持的加密算法。
2. server接收到信息之后給予client響應握手信息,包括隨機值2和匹配好的協商加密算法,這個加密算法一定是client發送給server加密算法的子集。
3. 隨即server給client發送第二個響應報文是數字證書。服務端必須要有一套數字證書,可以自己制作,也可以向組織申請。區別就是自己頒發的證書需要客戶端驗證通過,才可以繼續訪問,而使用受信任的公司申請的證書則不會彈出提示頁面,這套證書其實就是一對公鑰和私鑰。傳送證書,這個證書其實就是公鑰,只是包含了很多信息,如證書的頒發機構,過期時間、服務端的公鑰,第三方證書認證機構(CA)的簽名,服務端的域名信息等內容。
4. 客戶端解析證書,這部分工作是由客戶端的TLS來完成的,首先會驗證公鑰是否有效,比如頒發機構,過期時間等等,如果發現異常,則會彈出一個警告框,提示證書存在問題。如果證書沒有問題,那么就生成一個隨即值(預主秘鑰)。
5. 客戶端認證證書通過之后,接下來是通過隨機值1、隨機值2和預主秘鑰組裝會話秘鑰。然后通過證書的公鑰加密會話秘鑰。
6. 傳送加密信息,這部分傳送的是用證書加密后的會話秘鑰,目的就是讓服務端使用秘鑰解密得到隨機值1、隨機值2和預主秘鑰。
7. 服務端解密得到隨機值1、隨機值2和預主秘鑰,然后組裝會話秘鑰,跟客戶端會話秘鑰相同。
8. 客戶端通過會話秘鑰加密一條消息發送給服務端,主要驗證服務端是否正常接受客戶端加密的消息。
9. 同樣服務端也會通過會話秘鑰加密一條消息回傳給客戶端,如果客戶端能夠正常接受的話表明SSL層連接建立完成了。
## 六、運用與總結
### 安全性考慮
1. HTTPS協議的加密范圍也比較有限,在黑客攻擊、拒絕服務攻擊、服務器劫持等方面幾乎起不到什么作用
2. SSL證書的信用鏈體系并不安全,特別是在某些國家可以控制CA根證書的情況下,中間人攻擊一樣可行
> 中間人攻擊(MITM攻擊)是指,黑客攔截并篡改網絡中的通信數據。又分為被動MITM和主動MITM,被動MITM只竊取通信數據而不修改,而主動MITM不但能竊取數據,還會篡改通信數據。最常見的中間人攻擊常常發生在公共wifi或者公共路由上。
### 成本考慮
1. SSL證書需要購買申請,功能越強大的證書費用越高
2. SSL證書通常需要綁定IP,不能在同一IP上綁定多個域名,IPv4資源不可能支撐這個消耗(SSL有擴展可以部分解決這個問題,但是比較麻煩,而且要求瀏覽器、操作系統支持,Windows XP就不支持這個擴展,考慮到XP的裝機量,這個特性幾乎沒用)。
3. 根據ACM CoNEXT數據顯示,使用HTTPS協議會使頁面的加載時間延長近50%,增加10%到20%的耗電。
4. HTTPS連接緩存不如HTTP高效,流量成本高。
5. HTTPS連接服務器端資源占用高很多,支持訪客多的網站需要投入更大的成本。
6. HTTPS協議握手階段比較費時,對網站的響應速度有影響,影響用戶體驗。比較好的方式是采用分而治之,類似12306網站的主頁使用HTTP協議,有關于用戶信息等方面使用HTTPS。
原文鏈接:https://juejin.im/post/5dc63c5bf265da4d17138c2d