前言: 網上聊 HTTPS 的文章已經數都數不過來了吧,厚著臉皮,整理下讀書筆記,結合平常項目的實踐,也來聊聊 HTTPS。 ##一、為什麼需要 HTTPS? 眾所周知,HTTP 協議具有無連接、不可靠、盡最大努力的特點,這也為 HTPP 協議帶來信息竊聽或身份偽裝等安全問題。主要體現在幾個方面: ...
前言: 網上聊 HTTPS 的文章已經數都數不過來了吧,厚著臉皮,整理下讀書筆記,結合平常項目的實踐,也來聊聊 HTTPS。
一、為什麼需要 HTTPS?
眾所周知,HTTP 協議具有無連接、不可靠、盡最大努力的特點,這也為 HTPP 協議帶來信息竊聽或身份偽裝等安全問題。主要體現在幾個方面:
- 通信使用明文(不加密),內容可能會被竊聽。
- 不驗證通信方的身份,因此有可能遭遇偽裝。
- 無法證明報文的完整性,所以有可能已遭篡改。
那要如何做到防止竊聽保護信息呢?最為普及的就是加密技術。
- 通信的加密:用 SSL(Secure Socket Layer,安全套接層)或 TLS(Transport Layer Security,安全層傳輸協議)建立安全通信線路之後,就可以在這條線路上進行 HTTP 通信了。與 SSL/TLS 組合使用的 HTTP 就是 HTTPS,通常 HTTP 直接和 TCP 通信,當使用 SSL 時,則演變成先與 SSL 通信,再由 SSL 和 TCP 通信了,所以 HTTPS 並不是一種新的協議。
- 內容的加密: 對 HTTP 協議傳輸的內容本身加密,即把 HTTP 報文里所含的內容進行加密處理。
SSL 協議最初是由瀏覽器開發商網景通信公司率先倡導的,開發過 SSL3.0 之前的版本。IETF 以 SSL3.0 為基準,後又制定了 TLS1.0、TLS1.1 和 TLS1.2。TSL 是以 SSL為原型開發的協議,有時會統一稱該協議為 SSL。當前主流的版本是 SSL3.0 和 TLS1.0。
SSL 不僅提供加密處理,而且還使用了一種被稱為證書的手段,可用於確定通信方。
二、HTTPS 怎麼來保障通信安全的?
HTTPS 具有加密、認證以及完整性保護的功能。
1. 加密
客戶端和服務端想要進行安全的通信,首先想到的就是對通信雙方的內容進行加密處理。客戶端利用“密鑰”加密內容,服務端利用“密鑰”解密內容,反之亦然。這種方式稱為對稱(共用密鑰)加密。
對稱加密客戶端和服務端的“密鑰”是一致的,因此,客戶端和服務端之間的“密鑰”傳輸不可避免,如果“密鑰”在傳輸途中被盜用,那麼加密處理就沒有意義了。
那麼如何保護“密鑰”的傳輸安全呢?實踐的思路是非對稱(公開密鑰)加密,服務端擁有 公鑰(public key)+ 私鑰(private key)的密鑰對,公鑰任何人都可以獲取,私鑰只保存在服務端。以下是 SSL 建立安全通信線路的過程。
- 服務端將公鑰傳輸給客戶端。
- 客戶端通過公鑰加密“密鑰”(客戶端生成)得到一個加密串並傳輸給服務端。
- 服務端根據私鑰解密加密串得到“密鑰”。
- 雙方通過“密鑰”加密傳輸。
非對稱加密“密鑰”的方式很好的保障了“密鑰”的安全傳輸,因為即使傳輸過程中加密串被盜用了,由於盜用者沒有私鑰信息,也無法得到加密串中的“密鑰”信息。
HTTPS 採用對稱(共用密鑰)加密和非對稱(公開密鑰)加密兩者並用的混合加密機制。之所以要這麼複雜,是因為非對稱加密的處理速度相較於對稱加密要慢,因此,我們一般在交換“密鑰”環節使用非對稱加密,之後的建立通信交換報文階段則使用對稱加密方式。
2. 認證
遺憾的是,非對稱加密傳輸“密鑰”的方式仍然有缺陷,那就是無法證明伺服器公鑰本身就是貨真價實的公鑰。比如,接收到某台伺服器的公鑰,如何證明公鑰就是原本預想的那台伺服器發行的公鑰呢?或許在公鑰傳輸途中,真正的公鑰已經被攻擊者替換掉了。
電腦科學領域的任何問題都可以通過增加一個間接的中間層來解決。
這裡我們引入的中間層就是數字證書認證機構(CA,Certificate Authority),數字證書認證機構處於客戶端與伺服器雙方都可信賴的第三方機構的立場上,以下是數字證書認證機構的業務流程。
- 伺服器的運營人員向數字證書認證機構提出公開密鑰的申請。
- 數字證書認證機構在判明提出申請者的身份之後,會對已申請的公開密鑰做數字簽名,然後分配這個已簽名的公開密鑰,並將該公開密鑰放入公鑰證書。
- 伺服器將公鑰證書下發給客戶端。
- 客戶端使用公鑰證書的公開密鑰,對那張證書上的數字簽名進行驗證,一旦驗證通過,客戶端便可明確兩件事:一,認證伺服器的公開密鑰的是真實有效的數字證書認證機構頒發的。二,伺服器的公開密鑰是值得信賴的。
HTTPS 中還可以使用客戶端證書,以客戶端證書進行客戶端認證,證明伺服器正在通信的對方始終是預料之內的客戶端,其作用跟伺服器證書如出一轍。
使用 OpenSSL 這套開源程式,每個人都可以構建一套屬於自己的認證機構,從而自己給自己頒發伺服器證書,但該伺服器證書在互聯網上不可作為證書使用,因為個人並不是可信任的三方機構。
3. 完整性保護
基於 SSL 進行 HTTP 通信時,應用層發送數據會附加一種叫做 MAC(Message Authentication Code)的報文摘要,MAC 能夠查知報文是否遭到篡改,從而保護報文的完整性。
三、HTTPS 的通信過程
CBC 模式(Cipher Block Chaining)又名密碼分組鏈接模式。在此模式下,將前一個明文塊加密處理後和下一個明文塊做 XOR 運算,使之重疊,然後再對運算結果做加密處理。 對第一個明文塊做加密時,要麼使用前一段密文的最後一塊,要麼利用外部生成的初始向量(initial vector, IV)。
四、HTTPS 的缺點?
處理速度上,由於 HTTPS 還需要做伺服器、客戶端雙方加密及解密過程,因此會消耗 CPU 和記憶體等硬體資源。
通信上,和單純 HTTP 通信相比,SSL 通信會消耗部分網路資源。
綜上所述,相較於 HTTP 通信來說,HTTPS 通信速度會變慢。針對速度變慢這一問題,並沒有根本性的解決方案,我們會使用 SSL 加速器這種(專用伺服器)硬體來改善該問題。 該硬體為 SS通信專用硬體,相對軟體來講,能夠提高數倍 SSL 的計算速度。
另外,SSL 證書的費用開銷也是使用 HTTPS 的考慮因素之一(阿裡雲/騰訊雲有免費的 SSL 證書可以申請使用)。