本文主要內容:https基礎介紹,工作流程,工作原理
http or https?
https
1)Google 已調整搜索引擎算法,讓采用 HTTPS 的網站在搜索中排名更靠前;
2)從 2017 年開始,Chrome 瀏覽器已把采用 HTTP 協議的網站標記為不安全網站;
3)蘋果要求 2017 年 App Store 中的所有應用都必須使用 HTTPS 加密連接;
4)微信小程序也要求必須使用 HTTPS 協議;
5)HTTP/2.0 支持默認以 HTTPS 為基礎。
https是什么
簡而言之,HTTPS 就是在 HTTP 下加入了 SSL or TSL 層,在傳輸時對數據加密,從而保護了交換數據隱私和完整性,提供對網站服務器身份認證的功能,簡單來說它就是安全版的HTTP。
HTTP | HTTPS |
---|---|
http | http |
- | SSL/TSL |
TCP | TCP |
IP | IP |
SSL/TSL是什么
SSL(Secure Socket Layer,安全套接字層):1994年為 Netscape 所研發,SSL 協議位於 TCP/IP 協議與各種應用層協議之間,為數據通訊提供安全支持。
TLS(Transport Layer Security,傳輸層安全):其前身是 SSL,它最初的幾個版本(SSL 1.0、SSL 2.0、SSL 3.0)由網景公司開發,1999年從 3.1 開始被 IETF 標准化並改名,發展至今已經有 TLS 1.0、TLS 1.1、TLS 1.2 三個版本。SSL3.0和TLS1.0由於存在安全漏洞,已經很少被使用到。TLS 1.3 改動會比較大,目前還在草案階段,目前使用最廣泛的是TLS 1.1、TLS 1.2。
SSL/TSL作用
- 通過證書等信息確認網站的真實性;
- 建立加密的信息通道;
- 數據內容的完整性。
HTTPS=網站認證+數據加密+完整性驗證+HTTP
https加密了什么
- 除IP/域名,端口,User-Agent外都被加密
即運營商/HK/GFW只能知道你訪問的哪個ip或者域名,端口, User-Agent, Cookie是HTTP包的一部分,也被加密
https加密方式
在了解https工作流程之前,先來看看https的加密方式
對稱加密
- 對稱加密對稱加密是指加密與解密的使用同一個密鑰的加密算法。
目前常見的加密算法有:DES、AES、IDEA 等
弊端:客戶端和服務器需要同一個密鑰,那么必須有一方將密鑰發送給另一方,一旦該密鑰在發送過程中被截獲,安全無法保證。
非對稱加密
- 非對稱加密非對稱加密使用的是兩個密鑰,公鑰與私鑰,我們會使用公鑰對網站賬號密碼等數據進行加密,再用私鑰對數據進行解密。這個公鑰會發給查看網站的所有人,而私鑰是只有網站服務器自己擁有的。
目前常見非對稱加密算法:RSA,DSA,DH等。
弊端:公鑰對所有人開放,包括黑客,也就是說拿到公鑰的人都可以解開密文。
所以https是兩種加密一起使用
https工作流程
https通信流程
(1) 客戶端向服務器端索要並驗證公鑰。
(2) 雙方協商生成"對話密鑰"。
(3) 雙方采用"對話密鑰"進行加密通信。
1,2稱為握手階段
SSL四次握手
"握手階段"的所有通信都是明文的。
- 客戶端->服務端
(1) 支持的協議版本,比如TLS 1.0版。
(2) 一個客戶端生成的隨機數A
(3) 支持的加密方法,比如RSA公鑰加密。
(4) 支持的壓縮方法。
- 服務器->客戶端
(1) 確認使用的加密通信協議版本,比如TLS 1.0版本。如果瀏覽器與服務器支持的版本不一致,服務器關閉加密通信。
(2) 一個服務器生成的隨機數B
(3) 確認使用的加密方法,比如RSA公鑰加密。
(4) 服務器證書。(CA)
除了上面這些信息,如果服務器需要確認客戶端的身份,就會再包含一項請求,要求客戶端提供"客戶端證書"。比如,金融機構往往只允許認證客戶連入自己的網絡,就會向正式客戶提供USB密鑰,里面就包含了一張客戶端證書。
- 客戶端->服務端
客戶端收到服務器回應以后,首先驗證服務器證書。如果證書不是可信機構頒布、或者證書中的域名與實際域名不一致、或者證書已經過期,就會向訪問者顯示一個警告,由其選擇是否還要繼續通信。
如果證書沒有問題,客戶端就會從證書中取出服務器的公鑰。
(1) 一個隨機數C。該隨機數用服務器公鑰加密,防止被竊聽。
(2) 編碼改變通知,表示隨后的信息都將用雙方商定的加密方法和密鑰發送。
(3) 客戶端握手結束通知,表示客戶端的握手階段已經結束。這一項同時也是前面發送的所有內容的hash值,用來供服務器校驗。
上面第一項的隨機數,是整個握手階段出現的第三個隨機數,又稱"pre-master key"。有了它以后,客戶端和服務器就同時有了三個隨機數,接着雙方就用事先商定的加密方法,各自生成本次會話所用的同一把"會話密鑰"(對稱加密密鑰)。
- 服務器->客戶端
服務器收到客戶端的第三個隨機數pre-master key之后,計算生成本次會話所用的"會話密鑰"。然后,向客戶端最后發送下面信息。
(1)編碼改變通知,表示隨后的信息都將用雙方商定的加密方法和密鑰發送。
(2)服務器握手結束通知,表示服務器的握手階段已經結束。這一項同時也是前面發送的所有內容的hash值,用來供客戶端校驗。
而服務器用只有自己知道的私鑰來解密,獲取第三個隨機數。只有,服務端和客戶端都有了三個隨機數N1+N2+N3,然后兩端就使用這三個隨機數來生成“對話密鑰”,在此之后的通信都是使用這個“對話密鑰”來進行對稱加密解密。
因為這個過程中,服務端的私鑰只用來解密第三個隨機數,從來沒有在網絡中傳輸過,這樣的話,只要私鑰沒有被泄露,那么數據就是安全的。
至此,整個握手階段全部結束。接下來,客戶端與服務器進入加密通信,就完全是使用普通的HTTP協議,只不過用"會話密鑰"加密內容。
加密套件的交換
客戶端把自身支持的一系列Cipher Suite(密鑰算法套件,后文簡稱Cipher)[C1,C2,C3, …]發給服務器;
服務器接收到客戶端的所有Cipher后,與自己支持的套件作對比,如果找到雙方都支持的Cipher,則告知客戶端;
客戶端與服務器使用匹配的Cipher進行后續通信。如果服務器沒有找到匹配的算法,客戶端將給出錯誤信息。
客戶端如何校驗 CA 證書
CA 證書其實就是數字證書,是由 CA 機構頒發的。至於 CA 機構的權威性,那么是毋庸置疑的,所有人都是信任它的。CA 證書內一般會包含以下內容:
證書的頒發機構、版本
證書的使用者
證書的公鑰
證書的有效時間
證書的數字簽名 Hash 值和簽名 Hash 算法
…
CA 證書中的 Hash 值,其實是用證書的私鑰進行加密后的值(證書的私鑰不在 CA 證書中)。然后客戶端得到證書后,利用證書中的公鑰去解密該 Hash 值,得到 Hash-a ;然后再利用證書內的簽名 Hash 算法去生成一個 Hash-b 。最后比較 Hash-a 和 Hash-b 這兩個的值。如果相等,那么證明了該證書是對的,服務端是可以被信任的;如果不相等,那么就說明該證書是錯誤的,可能被篡改了,瀏覽器會給出相關提示,無法建立起 HTTPS 連接。除此之外,還會校驗 CA 證書的有效時間和域名匹配等。
計算Hash值,指的是利用Hash算法(MD5或SHA)將任意長度的數據轉換為固定長度的數據。