02.25 一文搞懂 HTTPS


前言:

1、HTTP 的缺點

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

1.2、不驗證通信方的身份就可能遭遇偽裝

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

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

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

2.2、HTTPS 是身披 SSL 外殼的 HTTP

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

2.4、證明公開密鑰正確性的證書

2.5、HTTPS 的安全通信機制

問題思考:為什麼不一直使用 HTTPS ?

在 HTTP 協議中有可能存在信息竊聽或身份偽裝等安全問題。使用HTTPS 通信機制可以有效地防止這些問題。


1、HTTP 的缺點

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

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

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

TCP/IP 是可能被竊聽的網絡:

按TCP/IP 協議族的工作機制,通信內容在所有的通信線路上都有可能遭到窺視。


加密對象的實現類型列舉:

  • 通信的加密:通過和 SSL(Secure Socket Layer,安全套接層)或TLS(Transport Layer Security,安全層傳輸協議)的組合使用,加密 HTTP 的通信內容。
  • 內容的加密:由於 HTTP 協議中沒有加密機制,那麼可以對 HTTP 協議傳輸的內容本身(HTTP 報文內容)加密。客戶端需要對 HTTP 報文進行加密處理後再發送請求。並要求客戶端和服務器同時具備加密和解密機制。


1.2、不驗證通信方的身份就可能遭遇偽裝

“HTTP無法判定請求是來自何方、出自誰手”

HTTP 協議中的請求和響應不會對通信方進行確認。也就是說存在“服務器是否就是發送請求中 URI 真正指定的主機,返回的響應是否真的返回到實際提出請求的客戶端”等類似問題。

  • 任何人都可發起請求:即使是無意義的請求也會照單全收。無法阻止海量請求下的 DoS 攻擊(Denial of Service,拒絕服務攻擊);
  • 查明對手的證書:雖然使用 HTTP 協議無法確定通信方,但如果使用 SSL 則可以。SSL 不僅提供加密處理,而且還使用了一種被稱為證書的手段,可用於確定方。

SSL證書

  • 證書由值得信任的第三方機構頒發,用以證明服務器和客戶端是實際存在的。另外,偽造證書從技術角度來說是異常困難的一件事。所以只要能夠確認通信方(服務器或客戶端)持有的證書,即可判斷通信方的真實意圖。
  • 通過使用證書,以證明通信方就是意料中的服務器。這對使用者個人來講,也減少了個人信息洩露的危險性。
  • 另外,客戶端持有證書即可完成個人身份的確認,也可用於對Web 網站的認證環節。


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

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


接收到的內容可能有誤:

  • 由於 HTTP 協議無法證明通信的報文完整性,因此,在請求或響應送出之後直到對方接收之前的這段時間內,即使請求或響應的內容遭到篡改,也沒有辦法獲悉。換句話說,沒有任何辦法確認,發出的請求 / 響應和接收到的請求 / 響應是前後相同的。
  • 比如,從某個 Web 網站上下載內容,是無法確定客戶端下載的文件和服務器上存放的文件是否前後一致的。文件內容在傳輸途中可能已經被篡改為其他的內容。即使內容真的已改變,作為接收方的客戶端也是覺察不到的。
  • 像這樣,請求或響應在傳輸途中,遭攻擊者攔截並篡改內容的攻擊稱為中間人攻擊(Man-in-the-Middle attack,MITM)。

HTTP如何防止篡改:

  • 雖然有使用 HTTP 協議確定報文完整性的方法,但事實上並不便捷、可靠。其中常用的是 MD5 和 SHA-1 等散列值校驗的方法,以及用來確認文件的數字簽名方法。
  • 提供文件下載服務的 Web 網站也會提供相應的以 PGP(PrettyGood Privacy,完美隱私)創建的數字簽名及 MD5 算法生成的散列值。PGP 是用來證明創建文件的數字簽名,MD5 是由單向函數生成的散列值。
  • 不論使用哪一種方法,都需要操縱客戶端的用戶本人親自檢查驗證下載的文件是否就是原來服務器上的文件。瀏覽器無法自動幫用戶檢查。

HTTP方式進行防篡改的缺陷:

  • 可惜的是,用這些方法也依然無法百分百保證確認結果正確。因為 PGP 和 MD5 本身被改寫的話,用戶是沒有辦法意識到的。
  • 為了有效防止這些弊端,有必要使用 HTTPS。SSL 提供認證和加密處理及摘要功能。僅靠 HTTP 確保完整性是非常困難的,因此通過和其他協議組合使用來實現這個目標。


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

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

我們把添加了加密及認證機制的 HTTP 稱為 HTTPS(HTTP Secure)。HTTPS 是身披 SSL 外殼的 HTTP 。


一文搞懂 HTTPS

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 就擁有了 HTTPS 的加密、證書和完整性保護這些功能。

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

一文搞懂 HTTPS

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

SSL採用一種叫做公開密鑰加密(Public-key cryptography)的加密處理方式。

近代的加密方法中加密算法是公開的, 而密鑰卻是保密的。 通過這種方式得以保持加密方法的安全性。

加密和解密都會用到密鑰。 沒有密鑰就無法對密碼解密, 反過來說,任何人只要持有密鑰就能解密了。 如果密鑰被攻擊者獲得, 那加密也就失去了意義。


Case1:共享秘鑰加密的困境

加密和解密同用一個密鑰的方式稱為共享密鑰加密(Common key crypto system) , 也被叫做對稱密鑰加密。

以共享密鑰方式加密時必須將密鑰也發給對方。 可究竟怎樣才能安全地轉交? 在互聯網上轉發密鑰時, 如果通信被監聽那麼密鑰就可會落入攻擊者之手, 同時也就失去了加密的意義。 另外還得設法安全地保管接收到的密鑰。


一文搞懂 HTTPS

Case2:使用兩把密鑰的公開密鑰加密

公開密鑰加密方式很好地解決了共享密鑰加密的困難。公開密鑰加密使用一對非對稱的密鑰。一把叫做私有密鑰(private key),另一把叫做公開密鑰(public key)。顧名思義,私有密鑰不能讓其他任何人知道, 而公開密鑰則可以隨意發佈, 任何人都可以獲得。


使用公開密鑰加密方式, 發送密文的一方使用對方的公開密鑰進行加密處理, 對方收到被加密的信息後, 再使用自己的私有密鑰進行解密。 利用這種方式, 不需要發送用來解密的私有密鑰, 也不必擔心密鑰被攻擊者竊聽而盜走。

一文搞懂 HTTPS

Case3:HTTPS 採用混合加密機制

HTTPS 採用共享密鑰加密和公開密鑰加密兩者並用的混合加密機制。 若密鑰能夠實現安全交換, 那麼有可能會考慮僅使用公開密鑰加密來通信。 但是公開密鑰加密與共享密鑰加密相比, 其處理速度要慢。 在交換密鑰環節使用公開密鑰加密方式, 之後的建立通信交換報文階段則使用共享密鑰加密方式。


一文搞懂 HTTPS

2.4、證明公開密鑰正確性的證書

公開密鑰存在的問題:

  • 那就是無法證明公開密鑰本身就是貨真價實的公開密鑰。比如,正準備和某臺服務器建立公開密鑰加密方式下的通信時,如何證明收到的公開密鑰就是原本預想的那臺服務器發行的公開密鑰。
  • 或許在公開密鑰傳輸途中,真正的公開密鑰已經被攻擊者替換掉了。

公開密鑰證書:

  • 為了解決上述問題,可以使用由數字證書認證機構(CA,CertificateAuthority)和其相關機關頒發的公開密鑰證書。
  • 數字證書認證機構處於客戶端與服務器雙方都可信賴的第三方機構的立場上。威瑞信(VeriSign)就是其中一家非常有名的數字證書認證機構。


數字證書認證機構的業務流程:

  • 首先,服務器的運營人員向數字證書認證機構提出公開密鑰的申請。
  • 數字證書認證機構在判明提出申請者的身份之後,會對已申請的公開密鑰做數字簽名,然後分配這個已簽名的公開密鑰,並將該公開密鑰放入公鑰證書後綁定在一起。
  • 服務器會將這份由數字證書認證機構頒發的公鑰證書發送給客戶端,以進行公開密鑰加密方式通信。公鑰證書也可叫做數字證書或直接稱為證書。
  • 接到證書的客戶端可使用數字證書認證機構的公開密鑰,對那張證書上的數字簽名進行驗證。


一文搞懂 HTTPS

一旦驗證通過,客戶端便可明確兩件事:

  • 一,認證服務器的公開密鑰的是真實有效的數字證書認證機構。
  • 二,服務器的公開密鑰是值得信賴的。

此處認證機關的公開密鑰必須安全地轉交給客戶端。使用通信方式時,如何安全轉交是一件很困難的事,因此,多數瀏覽器開發商發佈版本時,會事先在內部植入常用認證機關的公開密鑰。


2.5、HTTPS 的安全通信機制

為了更好地理解 HTTPS,我們來觀察一下 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-mastersecret 的隨機密碼串。該報文已用步驟 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(MessageAuthentication Code)的報文摘要。MAC 能夠查知報文是否遭到篡改,從而保護報文的完整性。


一文搞懂 HTTPS

問題思考:為什麼不一直使用 HTTPS ?

既然 HTTPS 那麼安全可靠, 那為何所有的 Web 網站不一直使用HTTPS ?

  • 其中一個原因是, 因為與純文本通信相比, 加密通信會消耗更多的CPU 及內存資源。 如果每次通信都加密, 會消耗相當多的資源, 平攤到一臺計算機上時, 能夠處理的請求數量必定也會隨之減少。
  • 因此, 如果是非敏感信息則使用 HTTP 通信, 只有在包含個人信息等敏感數據時, 才利 HTTPS 加密通信。
  • 特別是每當那些訪問量較多的 Web 網站在進行加密處理時,它們所承擔著的負載不容小覷。在進行加密處理時,並非對所有內容都進行加密處理,而是僅在那些需要信息隱藏時才會加密,以節約資源。
  • 除此之外,想要節約購買證書的開銷也是原因之一。要進行 HTTPS 通信,證書是必不可少的。而使用的證書必須向認證機構(CA)購買。證書價格可能會根據不同的認證機構略有不同。那些購買證書並不合算的服務以及一些個人網站,可能只會選擇採用 HTTP 的通信方式。


分享到:


相關文章: