圖解HTTP七:確保 Web 安全的 HTTPS

7.1 HTTP 的缺點

HTTP 主要有這些不足,例舉如下。

  • 通信使用明文(不加密),內容可能會被竊聽
  • 不驗證通信方的身份,因此有可能遭遇僞裝
  • 無法證明報文的完整性,所以有可能已遭篡改

7.1.1 通信使用明文可能會被竊聽

由於 HTTP 本身不具備加密的功能,所以也無法做到對通信整體(使用 HTTP 協議通信的請求和響應的內容)進行加密。即, HTTP 報文使用明文(指未經過加密的報文)方式發送。

TCP/IP 是可能被竊聽的網絡:即使已經過加密處理的通信,也會被窺視到通信內容,這點和未加密的通信是相同的。只是說如果通信經過加密,就有可能讓人無法破解報文信息的含義,但加密處理後的報文信息本身還是會被看到的。
在這裏插入圖片描述

互聯網上的任何角落都存在通信內容被竊聽的風險

加密處理防止被竊聽

  • 通道加密:一種方式就是將通信加密。 HTTP 協議中沒有加密機制,但可以通過和 SSL(Secure Socket Layer,安全套接層)或 TLS(Transport Layer Security,安全層傳輸協議)的組合使用,加密 HTTP 的通信內容。用 SSL 建立安全通信線路之後,就可以在這條線路上進行 HTTP 通信了。與 SSL 組合使用的 HTTP 被稱爲 HTTPS(HTTP Secure,超文本傳輸安全協議)或 HTTP over SSL 。
    在這裏插入圖片描述
  • 內容的加密:在這種情況下,客戶端需要對 HTTP 報文進行加密處理後再發送請求。
    在這裏插入圖片描述
    爲了做到有效的內容加密,前提是要求客戶端和服務器同時具備加密和解密機制。主要應用在Web 服務中。有一點必須引起注意,由於該方式不同於 SSL 或 TLS 將整個通信線路加密處理,所以內容仍有被篡改的風險。

7.1.2 不驗證通信方的身份就可能遭遇僞裝

HTTP 協議中的請求和響應不會對通信方進行確認。也就是說存在“服務器是否就是發送請求中 URI 真正指定的主機,返回的響應是否真的返回到實際提出請求的客戶端”等類似問題。
任何人都可發起請求
在 HTTP 協議通信時,由於不存在確認通信方的處理步驟,任何人都可以發起請求。另外,服務器只要接收到請求,不管對方是誰都會返回一個響應(但也僅限於發送端的 IP 地址和端口號沒有被 Web 服務器設定限制訪問的前提下)。

HTTP 協議的實現本身非常簡單,不論是誰發送過來的請求都會返回響應,因此不確認通信方,會存在
以下各種隱患。

  • 無法確定請求發送至目標的 Web 服務器是否是按真實意圖返回響應的那臺服務器。有可能是已僞裝的 Web 服務器。
  • 無法確定響應返回到的客戶端是否是按真實意圖接收響應的那個客戶端。有可能是已僞裝的客戶端。
  • 無法確定正在通信的對方是否具備訪問權限。因爲某些 Web 服務器上保存着重要的信息,只想發給特定用戶通信的權限。
  • 無法判定請求是來自何方、出自誰手。
  • 即使是無意義的請求也會照單全收。無法阻止海量請求下的 DoS 攻擊( Denial of Service,拒絕服務攻擊)。

查明對手的證書
雖然使用 HTTP 協議無法確定通信方,但如果使用 SSL 則可以。 SSL 不僅提供加密處理,而且還使用了一種被稱爲證書的手段,可用於確定方。證書由值得信任的第三方機構頒發,用以證明服務器和客戶端是實際存在的。另外,僞造證書從技術角度來說是異常困難的一件事。所以只要能夠確認通信方(服務器或客戶端)持有的證書,即可判斷通信方的真實意圖。
在這裏插入圖片描述
通過使用證書,以證明通信方就是意料中的服務器。這對使用者個人來講,也減少了個人信息泄露的危險性。另外,客戶端持有證書即可完成個人身份的確認,也可用於對 Web 網站的認證環節。

7.1.3 無法證明報文完整性,可能已遭篡改

所謂完整性是指信息的準確度。若無法證明其完整性,通常也就意味着無法判斷信息是否準確。

接收到的內容可能有誤:沒有任何辦法確認,發出的請求 / 響應和接收到的請求 / 響應是前後相同的。比如,從某個 Web 網站上下載內容,是無法確定客戶端下載的文件和服務器上存放的文件是否前後一致的。文件內容在傳輸途中可能已經被篡改爲其他的內容。即使內容真的已改變,作爲接收方的客戶端也是覺察不到的。像這樣,請求或響應在傳輸途中,遭攻擊者攔截並篡改內容的攻擊稱爲中間人攻擊(Man-in-the-Middle attack, MITM)。
在這裏插入圖片描述

中間人攻擊

如何防止篡改
提供文件下載服務的 Web 網站也會提供相應的以 PGP(Pretty Good Privacy,完美隱私)創建的數字簽名及 MD5 算法生成的散列值。 PGP 是用來證明創建文件的數字簽名, MD5 是由單向函數生成的散列值。不論使用哪一種方法,都需要操縱客戶端的用戶本人親自檢查驗證下載的文件是否就是原來服務器上的文件。瀏覽器無法自動幫用戶檢查。可惜的是,用這些方法也依然無法百分百保證確認結果正確。因爲 PGP 和 MD5 本身被改寫的話,用戶是沒有辦法意識到的。爲了有效防止這些弊端,有必要使用 HTTPS。 SSL 提供認證和加密處理及摘要功能。僅靠 HTTP 確保完整性是非常困難的,因此通過和其他協議組合使用來實現這個目標。

7.2 HTTP+ 加密 + 認證 + 完整性保護 =HTTPS

7.2.1 HTTP 加上加密處理和認證以及完整性保護後即是 HTTPS

我們把添加了加密及認證機制的 HTTP 稱爲 HTTPS(HTTP Secure)。
在這裏插入圖片描述

使用 HTTPS 通信

7.2.2 HTTPS 是身披 SSL 外殼的 HTTP

HTTPS 並非是應用層的一種新協議。只是 HTTP 通信接口部分用 SSL(Secure Socket Layer)和 TLS(Transport Layer Security)協議代替而已。通常, HTTP 直接和 TCP 通信。當使用 SSL 時,則演變成先和 SSL 通信,再由 SSL 和 TCP 通信了。簡言之,所謂 HTTPS,其實就是身披 SSL 協議這層外殼的 HTTP。


SSL 是獨立於 HTTP 的協議,所以不光是 HTTP 協議,其他運行在應用層的 SMTP 和 Telnet 等協議均可配合 SSL 協議使用。可以說 SSL 是當今世界上應用最爲廣泛的網絡安全技術。

7.2.3 相互交換密鑰的公開密鑰加密技術

SSL 採用一種叫做公開密鑰加密( Public-keycryptography)的加密處理方式。加密方法中加密算法是公開的,而密鑰卻是保密的。通過這種方式得以保持加密方法的安全性。加密和解密都會用到密鑰。沒有密鑰就無法對密碼解密,反過來說,任何人只要持有密鑰就能解密了。如果密鑰被攻擊者獲得,那加密也就失去了意義。

共享密鑰加密的困境:加密和解密同用一個密鑰的方式稱爲共享密鑰加密(Common key crypto system),也被叫做對稱密鑰加密。
在這裏插入圖片描述
以共享密鑰方式加密時必須將密鑰也發給對方。可究竟怎樣才能安全地轉交?在互聯網上轉發密鑰時,如果通信被監聽那麼密鑰就可會落入攻擊者之手,同時也就失去了加密的意義。另外還得設法安全地保管接收到的密鑰。

使用兩把密鑰的公開密鑰加密
公開密鑰加密方式很好地解決了共享密鑰加密的困難。公開密鑰加密使用一對非對稱的密鑰。一把叫做私有密鑰(private key),另一把叫做公開密鑰(public key)。顧名思義,私有密鑰不能讓其他任何人知道,而公開密鑰則可以隨意發佈,任何人都可以獲得。使用公開密鑰加密方式,發送密文的一方使用對方的公開密鑰進行加密處理,對方收到被加密的信息後,再使用自己的私有密鑰進行解密。
在這裏插入圖片描述
HTTPS 採用混合加密機制
在交換密鑰環節使用公開密鑰加密方式,之後的建立通信交換報文階段則使用共享密鑰加密方式。
在這裏插入圖片描述

混合加密機制

7.2.4 證明公開密鑰正確性的證書

首先,服務器的運營人員向數字證書認證機構提出公開密鑰的申請。數字證書認證機構在判明提出申請者的身份之後,會對已申請的公開密鑰做數字簽名,然後分配這個已簽名的公開密鑰,並將該公開密鑰放入公鑰證書後綁定在一起。
服務器會將這份由數字證書認證機構頒發的公鑰證書發送給客戶端,以進行公開密鑰加密方式通信。公鑰證書也可叫做數字證書或直接稱爲證書。
接到證書的客戶端可使用數字證書認證機構的公開密鑰,對那張證書上的數字簽名進行驗證,一旦驗證通過,客戶端便可明確兩件事:一,認證服務器的公開密鑰的是真實有效的數字證書認證機構。二,服務器的公開密鑰是值得信賴的。
在這裏插入圖片描述

7.2.5 HTTPS 的安全通信機制

在這裏插入圖片描述

HTTPS 通信

  • 步驟 1: 客戶端通過發送 Client Hello 報文開始 SSL 通信。報文中包含客戶端支持的 SSL 的指定版本、加密組件(Cipher Suite)列表(所使用的加密算法及密鑰長度等)。

  • 步驟 2: 服務器可進行 SSL 通信時,會以 Server Hello 報文作爲應答。和客戶端一樣,在報文中包含 SSL版本以及加密組件。服務器的加密組件內容是從接收到的客戶端加密組件內篩選出來的。

  • 步驟 3: 之後服務器發送 Certificate 報文。報文中包含公開密鑰證書。

  • 步驟 4: 最後服務器發送 Server Hello Done 報文通知客戶端,最初階段的 SSL 握手協商部分結束。

  • 步驟 5: SSL 第一次握手結束之後,客戶端以 Client Key Exchange 報文作爲迴應。報文中包含通信加密中使用的一種被稱爲 Pre-master secret 的隨機密碼串。該報文已用步驟 3 中的公開密鑰進行加密。

  • 步驟 6: 接着客戶端繼續發送 Change Cipher Spec 報文。該報文會提示服務器,在此報文之後的通信會採用 Pre-master secret 密鑰加密。

  • 步驟 7: 客戶端發送 Finished 報文。該報文包含連接至今全部報文的整體校驗值。這次握手協商是否能夠成功,要以服務器是否能夠正確解密該報文作爲判定標準。

  • 步驟 8: 服務器同樣發送 Change Cipher Spec 報文。

  • 步驟 9: 服務器同樣發送 Finished 報文。

  • 步驟 10: 服務器和客戶端的 Finished 報文交換完畢之後, SSL 連接就算建立完成。當然,通信會受到 SSL的保護。從此處開始進行應用層協議的通信,即發送 HTTP 請求。

  • 步驟 11: 應用層協議通信,即發送 HTTP 響應。

  • 步驟 12: 最後由客戶端斷開連接。斷開連接時,發送 close_notify 報文。上圖做了一些省略,這步之後再發送 TCP FIN 報文來關閉與 TCP 的通信。在以上流程中,應用層發送數據時會附加一種叫做 MAC(Message Authentication Code)的報文摘要。MAC 能夠查知報文是否遭到篡改,從而保護報文的完整性。

下面是對整個流程的圖解。圖中說明了從僅使用服務器端的公開密鑰證書(服務器證書)建立 HTTPS 通信的整個過程。
在這裏插入圖片描述

  • SSL 和 TLS:HTTPS 使用 SSL(Secure Socket Layer) 和 TLS(Transport Layer Security)這兩個協議。
  • SSL 速度慢嗎:
    在這裏插入圖片描述
HTTPS 比 HTTP 要慢 2 到 100 倍

SSL 的慢分兩種。一種是指通信慢。另一種是指由於大量消耗 CPU 及內存等資源,導致處理速度變慢。和使用 HTTP 相比,網絡負載可能會變慢 2 到 100 倍。除去和 TCP 連接、發送 HTTP 請求 • 響應以外,還必須進行 SSL 通信,因此整體上處理通信量不可避免會增加。另一點是 SSL 必須進行加密處理。在服務器和客戶端都需要進行加密和解密的運算處理。因此從結果上講,比起 HTTP 會更多地消耗服務器和客戶端的硬件資源,導致負載增強。

針對速度變慢這一問題,並沒有根本性的解決方案,我們會使用 SSL 加速器這種(專用服務器)硬件來改善該問題。該硬件爲 SSL 通信專用硬件,相對軟件來講,能夠提高數倍 SSL 的計算速度。僅在 SSL處理時發揮 SSL 加速器的功效,以分擔負載。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章