這段時(shí)間畢竟也是 “金九銀十” 的面試的黃金季節(jié),阿粉當(dāng)然也想去面試,但是因?yàn)樽陨硎芟蓿灾荒懿稍L一下出去面試的同學(xué)們都問了什么內(nèi)容,其中有一個(gè),阿粉覺得有必要給大家分享一下,就是問關(guān)于 HTTP 的內(nèi)容。
HTTP
HTTP協(xié)議是Hyper Text Transfer Protocol(超文本傳輸協(xié)議)的縮寫,是用于從萬維網(wǎng)服務(wù)器傳輸超文本到本地瀏覽器的傳送協(xié)議。HTTP 是基于 TCP/IP 協(xié)議通信協(xié)議來傳遞數(shù)據(jù)(html 文件、圖片文件、查詢結(jié)果等)。它不涉及數(shù)據(jù)包(packet)傳輸,主要規(guī)定了客戶端和服務(wù)器之間的通信格式,默認(rèn)使用80端口。
這其實(shí)就是百度百科里面的精簡化的內(nèi)容,雖然說不上太細(xì)致,但是已經(jīng)算是對(duì)HTTP做了一個(gè)大概的描述,我們接下來就從以下的幾個(gè)方面來看一下這個(gè)HTTP吧。
我們從這里就不再多解釋 HTTP報(bào)文 和 主體 這些內(nèi)容了,阿粉之前也是完整的給大家解釋過了,包括了 HTTP 的進(jìn)化歷史,阿粉今天我們來講講 HTTP 和 HTTPS 的關(guān)系。
HTTP缺點(diǎn)
眾所周知,HTTP 的優(yōu)點(diǎn)那可是一大堆:
- 簡單、靈活、易于擴(kuò)展
- 應(yīng)用廣泛、環(huán)境成熟
- 無狀態(tài) (不需要額外的資源來記錄狀態(tài)信息)
但是 HTTP 的缺點(diǎn)也是非常的顯著,為什么這么說,HTTP 使用的是明文的方式進(jìn)行傳輸,雖然方便了我們的調(diào)試,但是信息會(huì)被暴露出來,每一個(gè)環(huán)節(jié)沒有隱私可言。
而且 HTTP 在我們的認(rèn)知當(dāng)中,他就是一個(gè)不安全的,第一個(gè)原因是上面說的明文,還有就是 HTTP 不驗(yàn)證通信雙方的身份,所以對(duì)方的身份有可能偽裝,就像某些公共場(chǎng)所的那些 公共WIFI ,還有就是 HTTP 不能驗(yàn)證報(bào)文的完整性,所以報(bào)文也是有可能被篡改的。
基于這些內(nèi)容,所以我們很多時(shí)候?qū)?HTTP 的選擇都比較慎重,不然你傳輸內(nèi)容的時(shí)候,別人用抓包工具就很容易的能夠分析出你想要傳遞的內(nèi)容。
這時(shí)候我們就想到了一個(gè)事情,加密處理一下不就好了?
對(duì),完全沒問題,HTTP 沒有加密的機(jī)制,但是我們可以想辦法處理,這個(gè)辦法就是:
SSL 或者 TLS
SSL: 安全套接層
TLS:安全層傳輸協(xié)議
當(dāng)他們組合使用的時(shí)候,就能夠加密 HTTP 的通信的內(nèi)容了,這時(shí)候就能在這條線路上進(jìn)行通信,而通過 SSL組合使用后的 HTTP 被稱為 HTTPS 或者稱之為 HTTP overSSL。
HTTPS
大白話說一下,HTTP 在加上加密處理和認(rèn)證以及完整性保護(hù)之后就是 HTTPS。
分辨 HTTPS 最簡單的方法就是,你在瀏覽器訪問的時(shí)候,能夠看到一個(gè)小鎖的標(biāo)識(shí)。
現(xiàn)在百分之90以上的網(wǎng)站不都是使用的 HTTPS 么,
我們使用抓包工具來看一下 HTTPS 的傳輸內(nèi)容試試。
我們從中看到了TLS 的版本,還有阿粉沒有截圖上的隨機(jī)數(shù)。
這時(shí)候我們就得來完整的分析 HTTPS 的安全通信機(jī)制了。來看個(gè)圖看一下 然后我們?cè)倌梦覀兊淖グぞ邅磉M(jìn)行分析。
上面這是 HTTPS 的安全通信的機(jī)制,我們分別來看看都干了什么。
第一步:Client Hello
客戶端通過 發(fā)送 Client Hello 報(bào)文開始 SSL/TSL 通信。其中包含了 SSL/TSL 的版本,所使用的加密的方法等一系列的內(nèi)容。
第二步:Server Hello
服務(wù)端根據(jù)客戶端發(fā)送的支持的 SSL/TLS 協(xié)議版本,和自己的比較確定使用的 SSL/TLS 協(xié)議版本。缺點(diǎn)假面算法等內(nèi)容。
第三步:服務(wù)器發(fā)送 Certificate 報(bào)文,報(bào)文中包含了公開密鑰證書。
證書的目的實(shí)際上就是保證標(biāo)識(shí)的身份,證書一般采用X.509標(biāo)準(zhǔn)。
第四步:Server Key Exchange
服務(wù)器發(fā)送 Server Hello Done 報(bào)文請(qǐng)求客戶端,第一階段的 SSL/TSL 握手協(xié)商部分結(jié)束。
也有很多人習(xí)慣的稱第四步是 Server Hello Done 實(shí)際上當(dāng)我們抓包的時(shí)候,發(fā)現(xiàn)他們是在一次請(qǐng)求中的,我們一會(huì)抓包看一下試試。Server Hello Done 實(shí)際上就是相當(dāng)于我給你說我這邊發(fā)完畢了。
第五步:Client Key Exchange
完成 SSL/TSL 第一次握手之后,客戶端就發(fā)送 Client Key Exchange 報(bào)文作為回應(yīng),這里實(shí)際上就是為了交換秘鑰參數(shù),
這里客戶端會(huì)再生成一個(gè)隨機(jī)數(shù),然后使用服務(wù)端傳來的公鑰進(jìn)行加密得到密文PreMaster Key。服務(wù)端收到這個(gè)值后,使用私鑰進(jìn)行解密,這樣兩邊的秘鑰就協(xié)商好了。后面數(shù)據(jù)傳輸就可以用協(xié)商好的秘鑰進(jìn)行加密和解密。
第六步:Change Cipher Spec
客戶端發(fā)送 Change Cipher Spec 報(bào)文,提示服務(wù)器編碼改變,就是說以后我們?cè)侔l(fā)消息的時(shí)候,我是用之前我們定義的密鑰進(jìn)行加密。
第七步:Client Finished
戶端將前面的握手消息生成摘要再用協(xié)商好的秘鑰加密,這是客戶端發(fā)出的第一條加密消息,這一步也是比較關(guān)鍵的一步,這次的操作的成功與否,就得看服務(wù)器是否能夠成功解密這次的報(bào)文來作為判斷依據(jù)了。
第八步:服務(wù)器發(fā)送 Change Cipher Spec
第九步:服務(wù)器發(fā)送Server Finished 報(bào)文
實(shí)際上作用和 Client 差不多。
第十步:服務(wù)端和客戶端的 Finished 交換完成了,這時(shí)候 SSL/TSL 的連接就OK了,發(fā)送信息也就是完整的稱為 HTTPS 了。
最后就是進(jìn)行數(shù)據(jù)傳輸?shù)膬?nèi)容了。
既然 HTTPS 都是安全的了,為什么不大范圍的廣泛使用呢?
實(shí)際上加密通信雖然在一定程度上保護(hù)了數(shù)據(jù)的隱私,但是效率比較低,每一次通信都要加密,會(huì)消耗資源,如果包含一些錢的肯定那必須得使用加密的通信,而且主要證書要收費(fèi)呀。
你要想用,那肯定需要證書,就像大家在做微信支付的時(shí)候,不是也需要購買證書么,一般一年怎么也得幾百塊錢,所以你知道 HTTP 和 HTTPS 的關(guān)系了么?