寫在前面
參考
https連接的前幾毫秒發生了什麼
HTTP與HTTPS的區別
HTTPS概念
HTTPS = HTTP + TLS
使用TLS對數據進行加密,但是數據傳輸依舊使用的是TCP。因此HTTPS作用有二:一是保護數據安全,二是通過證書驗證網站的真實性。
HTTPS主要解決的問題是中間人攻擊,中間人攻擊一是可以竊取連接過程中的數據並篡改,二是可以欺騙客戶端將數據包發往中間人處。
有了HTTPS可以很好地解決這個問題:可以通過證書驗證網站的可信度並且對數據進行加密防止被篡改。
HTTP與HTTPS的區別
- https需要證書,可以自己製作或者購買。自己製作的沒有得到驗證將會跳出彈窗請求用戶允許。
- http數據是明文傳輸的,https則是加密傳輸。
- http端口爲80,https爲443。
HTTPS工作原理
https的連接有幾個過程,下面一一說明。
客戶端發起HTTPS請求
瀏覽器會給服務器發送一個包,主要有以下信息:
TLS版本:主要說明客戶端使用TLS的版本號
隨機字符串: 用於之後的密鑰對生成
sessionId: 會話id,第一次連接時爲0。之後可以通過這個sessionId進行重新連接而不需要進行握手階段。
瀏覽器支持的所有加密方式: 發送給服務器讓其選擇一個加密方式,之後按照這個加密方式給數據進行加密。
域名信息: 雖然握手階段是在傳輸層的,但是獲取相應證書需要發送域名信息。
服務端迴應(Server Hello)
這個包會發送到客戶端,裏面的內容和上面客戶端發送包的內容差不多。
sessionId: 服務端發送給客戶端設置其sessionId。
隨機字符串: 用於之後的密鑰生成。
服務端選擇的加密方式: 上面有提到客戶端會發送一系列加密方式給服務端選擇,服務端會將其選擇返回給服務端。
服務端發送證書
隨後服務端會發送證書給客戶端,證書不一定是一份,而且很有可能是多份。每一份證書和上級證書都有依賴關係,這樣只需要驗證最上級證書的可靠性就可以保證下級證書的可靠性。
證書有以下內容:
- 簽名:表示證書的依賴關係。如果驗證了簽名正確,那麼就可以驗證下級證書的正確性。簽名是服務端用密鑰與tbsCertificate加密得到的一個字符串。
- 簽名算法
- tbsCertificate(to be signed Certificate): 包含申請證書時的國家、地區、城市、證書支持的域名、申請時間以及過期時間等。最重要的是證書的公鑰。
這裏主要說一下簽名的用處,簽名主要是用來檢驗證書是否被篡改過的。
主要的方式是 1. 客戶端會使用穿過來的公鑰對簽名進行解密,得到一個hash值。2. 計算tbsCertificate的DER編碼值的hash值。 3. 對比二者的hash值,若相同表示沒有被篡改過。
進行密鑰交換
上面說過服務器會選擇一個加密方式比如
Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)
其中這表示服務器選中的密鑰交換加密方式爲RSA
,數據傳輸加密方式爲AES
,檢驗數據是否合法的算法爲SHA256
.
密鑰交換的過程是這樣的:
- 服務端傳來一個包包含它的公鑰。
- 客戶端使用上面服務端傳來的隨機值和這個公鑰進行加密,生成自己的密鑰對。
- 發送自己的公鑰給服務端。
RSA:
(1)乙方生成兩把密鑰(公鑰和私鑰)。公鑰是公開的,任何人都可以獲得,私鑰則是保密的。
(2)甲方獲取乙方的公鑰,然後用它對信息加密。
(3)乙方得到加密後的信息,用私鑰解密。
所以此時雙方都擁有對方的公鑰,可以使用這個進行加密,對方再用私鑰進行解密。
進行數據傳輸
交換完密鑰後,服務端會發送一個明文包給客戶端表示可以其已經準備好傳輸了,客戶端也會發送一個這樣的包表示自己準備好了。然後客戶端就可以開始進行數據傳輸了。
缺點
說了這麼多,難道HTTPS沒有缺點嗎?
- 建立https需要花費時間(~0.3s)
- 數據需要加密和解密,佔用更多的cpu
- 數據加密後比原信息更大,佔用更多的帶寬