- HTTPS是傳輸協議嗎?
- HTTPS與HTTP有什麼關係?
- HTTPS為什麼會安全?
閒扯一下
Mac筆記本、Windows臺式機、Linux主機。像這三種類型,它們硬件不同,系統不同,服務端處理的編程語言不同。它們之間卻可以在網絡的世界了自由聯通。靠的是什麼呢?
靠的是它們遵守相同的規則(如:HTTP)。應用層用什麼格式(語言編碼,報文字段)封裝報文、傳輸層如何將大量的數據分段,並給每幀數據添加編號和端口信息、網絡層如何給沒幀數據添加IP地址,目標MAC地址、數據鏈路層如何將數字信息通過網卡發出去。
HTTPS是傳輸協議嗎?
目前常見的應用層協議
好像沒有看到HTTPS啊?
沒錯,HTTPS並非TCP/IP協議族中的一員,它其實是HTTP協議+SSL協議的組合體,是披著SSL外衣的HTTP。
HTTPS與HTTP有什麼關係?
HTTP實現的功能:一種機制簡單(這也是從早期眾多傳輸協議中走出來的原因)的超文本傳輸協議,為客戶端和服務器通信服務,是處在TCP/IP協議族中的應用層協議。
HTTP在發送請求時,採用四層架構。
應用層:提供多種應用服務,如:HTTP FTP DNS等,可以直接提供給開發者使用。
傳輸層:網絡間數據的傳輸,如:TCP TDP,報文數據分割打包成幀
網絡層:處理網絡中流動的數據包,在複雜的網絡段中選擇一條傳輸路線,將數據包送到目的地。將現實中的寄快遞(在快遞上寫上收件地址等信息,送到快遞點(類似於路由器))
數據鏈路層:處理鏈接網絡的硬件部分,如:網絡適配器,硬件驅動,操作系統,光纖。
HTTP請求過程中的重要概念!
1.數據包在網絡層怎麼走的呢?
在數據包傳輸過程中,需要不斷使用地址解析協議(IP和MAC地址對應的表,互相反查),進行路由選擇(將數據包丟給一個路由器,路由器會根據數據包上帶的地址,自動分揀,傳給它認為比較好的下一站路,直到到達目的地)
2.TCP通訊三次握手
- 客戶端先發送一個SYN(synchronize)
- 服務端收到後,返回一個SYN(synchronize)/ACK(acknowledgement)
- 客戶端發送一個ACK(acknowledgement)
3.DNS域名解析服務:在瀏覽器輸入url後,點擊enter。
1.網絡首先會拿填寫的域名到dns服務器查詢對應的IP地址。
2.瀏覽器將請求傳給返回的IP地址。
4.HTTP與HTTPS通信的區別
只是在應用層與傳輸層之間添加了一個SSL層
HTTPS為什麼會安全?
既然HTTPS是披著SSL外衣的HTTP,那SSL是什麼呢?
SSL是安全套接字層,是目前比較成熟的提供可靠數據傳輸的安全協議。SSL可以提供證書認證,數據加密,完整性保護等保護性策略。
數據加密原理
SSL採用的加密策略是:非對此加密+對稱加密的混合加密方式
- 對成加密:單純的對稱加密,加密解密的效率高,但是在客戶端於服務端共享密鑰時,容易被中間劫持洩露,不夠安全
- 非對稱加密:是新一代加密方案,加密解密銷量低,但是可以實現密鑰的安全傳輸,想通過公鑰解出私鑰難道極大,基本不可能。
最中採用在第一次交換共享密鑰時,使用非對稱加密。然後用共享密鑰加密。這樣既避免了密鑰被劫持,又保證了效率
數據完整性策略
採用報文摘要的策略,防止報文主題被修改。
在報文發送前,先通過md5-base64加密,得到一個報文主體的摘要,把這個摘要放到請求首部中,等服務器收到信息,採用同樣的算法,加密報文主體,根據得到的結果是否和報文摘要一致來判斷數據的完整性。
SSL和TLS的關係
目前常見的加密協議有兩個SSL3.0和TLS1.0,它們之間有什麼區別呢?
- SSL(Secure Socket Layer):是有瀏覽器開發商網景通信公司發起並開發到了SSL3.0版本
- TLS(Transport Layer Security):後面主導權移交給了IETF組織,他們在SSL3.0基礎上開發了 TLS一系列版本。它們是“父子”關係。
HTTPS協議安全通信步驟
HTTPS協議安全通信步驟中有三個主角元素:客戶端,服務器,第三方可信任的證書頒發機構。
過程如下:
- 服務器的運維人員向“第三方可信任的證書頒發機構”提供公司的有效信息+公鑰。
- “第三方可信任的證書頒發機構”認證公司有效,就用“第三方可信任的證書頒發機構”的私鑰給服務器的公鑰簽名,然後創建一個證書,證書中加入了公鑰+公鑰簽名結果,發給服務器。服務器運營人員需要支付一定的費用。
- 客服端安裝瀏覽器,瀏覽器內部內置了“第三方可信任的證書頒發機構”的根證書,裡面包含了“第三方可信任的證書頒發機構”的公鑰信息
- //正式開始SSL通信
- 客戶端發送請求給ClientHello到服務器,請求報文中包含客戶端支持的SSL指定版本號,加密組件列表(使用的加密算法和密鑰長度)
- 服務端收到請求後,也回發生個ClientHello回應,裡面包含了使用的SSL版本和加密組件(該加密組件是從客戶端發生的列表中篩選出來的)
- 緊接著服務器發生證書報文(Certificate),將服務器申請的公鑰證書傳給客戶端
- 然後服務器發生一個Server Hello Done報文給客戶端,表示初期階段的SSL握手協商結束。
- 客戶端收到服務器發來的公鑰證書後,拿本地存儲的第三方機構根證書中的公鑰對證書中的簽名信息解密,如果解密的結構同證書中的原始服務器公鑰信息一樣,證明服務器可信。
- 接著客戶端在本地生成一個隨機密碼字符串。用服務器的公鑰加密這個字符串,將得到的結果傳遞給服務器器。
- 然後客戶端再發送一個Change Cipher Spec報文(修改加密規則說明)給服務器,告訴服務器下面的通信將採用剛才的隨機密碼字符串作為加密密鑰。
- 最後客戶端發生一個Finish報文,報文中包含了從連接到現在所有報文的整體校驗碼,上面一系列的握手協商是否能最後成功,就看服務器能否正確解密這個Finish報文了。
- 服務器正確解密後,也發送個Change Cipher Spec報文(修改加密規則說明)給客戶端。
- 最後服務端也發送個Finish報文讓客戶端解密驗證。
- 等客戶端、服務器兩者的Finished報文都正常交換後,SSL連接算是正式建立完成。下面的通信就會受到SSL的加密保護。
- 現在客戶端就可以安全的給服務器發送簡單的應用層協議(http)了,並得到受保護的響應
- 最後通訊完成,由客戶端發送close_notify報文,通知服務器斷開鏈接。
閱讀更多 程序猿猩球 的文章