真正“搞”懂HTTPS協議15之安全的定義

Zaking發表於2023-02-13

  前面我們花了很大的篇幅來講HTTP在效能上的改進,從1.0到1.1,再到2.0、3.0,HTTP透過替換底層協議,解決了一直阻塞效能提升的隊頭阻塞問題,在效能上達到了極致。

  那麼,接下來,我們來聊一聊HTTP在安全上都做了哪些事情,HTTPS是如何幫助HTTP解決安全問題的。

  那為什麼要有HTTPS呢?其本質原因就是因為我們之前說過的哈,因為HTTP是不安全的。它明文的特點,雖然給我們的學習帶來了一定的便利性,但是也正是因為如此,在整個報文的傳輸過程中,任何人都能在鏈路中訪問、截獲、修改或者偽造請求/響應的資料。

  比如,就拿前兩篇文章講的代理服務。它作為 HTTP 通訊的中間人,在資料上下行的時候可以新增或刪除部分頭欄位,也可以使用黑白名單過濾 body 裡的關鍵字,甚至直接傳送虛假的請求、響應,而瀏覽器和源伺服器都沒有辦法判斷報文的真偽。

  這對於網路購物、網上銀行、證券交易等需要高度信任的應用場景來說是非常致命的。如果沒有基本的安全保護,使用網際網路進行各種電子商務、電子政務就根本無從談起。

  對於安全性不那麼高的入口網站、新聞網站、影片網站等,也可能會在頁面中嵌入廣告,分流使用者,致使網站損失。

  對於我們普通人來說,危害性更大,不知不覺,你的隱私資訊就被洩露,甚至威脅人身和財產安全。

  我們想象一下,就像《三體》小說中的黑暗森林定義,他人即地獄,所有的一切都是不可靠,不可信的。

  所以,保證HTTP報文的資料安全,成了一件必然且急迫的事情。

一、安全的定義

  首先,我們想要建立安全,有一個前提,就是我們要先知道什麼是安全。那什麼樣的通訊過程才算是“安全”呢?

  通常認為,如果通訊過程具備了四個特性,就可以認為是“安全”的,這四個特性是:機密性、完整性,身份認證和不可否認

  機密性(Secrecy/Confidentiality),是指對資料的保密,只能由可信的人訪問,對其他人是不可見的”秘密“,簡單的說就是不能讓不相關的人看到不該看的東西。比如戰爭時代,電臺傳遞的資訊都是加密的,然後傳遞的終端的接收人裡會有個密碼本,根據密碼本來解密傳遞的加密資訊,如果這個密碼本被敵軍獲取或者破解,你的策略和方針就毫無秘密可言。

  完整性(Integrity),也叫做一致性,是指資料在傳輸過程中沒有被篡改,不多也不少,”完完整整“的傳送給對方。機密性雖然可以保證讓資料保密,但是並不能防止資料被改動,假如駭客在獲取大量加密資料後,透過碰撞碰撞出某些關鍵字,那麼駭客就可以替換其中一部分資料,或者調整順序,破壞通訊資料的可靠性。

  身份認證(Authentication),是指確認對方的真實身份,也就是”怎麼證明你真的是你“,保證訊息之傳送給可信的人。如果通訊時另外一方是一個假冒網站,那麼資料再保密再完整也沒用,駭客完全可以使用冒充的身份套出各種資訊,加密不加密,完整不完整,沒啥意義,因為你最終的接收人就是不可靠的。

  那麼在現實生活中,你怎麼證明你是你呢?嗯……身份證唄。我們後面就會詳細的說一下網站的身份證是如何工作的。

  不可否認(Non-repudiation/Undeniable),也叫做不可抵賴,意思是不能否認已經發生過的行為,不能說話不算數,不認賬。

  使用前三個特性,可以解決安全通訊的大部分問題,但是如果缺少了不可否認,那通訊的事務的真實性就得不到保證,有可能出現說話不負責的情況。

  所以,只有同時具備了機密性、完整性、身份認證、不可否認四個特性,通訊雙方的利益才能得到保障,才能算得上是真正的安全。

二、What is HTTPS?

  那什麼是HTTPS?一句話,就是為HTTP增加了安全通訊的四大特性。

  其實HTTPS特別簡單,RFC文件只有7頁,裡面規定了新的協議名https預設埠號是443,至於其它的請求-應答模型、報文結構、請求方法、URI、頭欄位、連線管理等等都完全沿用HTTP,沒有任何新的東西。

  也就是說,HTTPS除了在安全上的改進,它擁有HTTP一切的優缺點,一模一樣,沒區別。

  那HTTPS是如何做到安全的四大特性的呢?嗯……就是多出來的那個S。

  它把HTTP下層的傳輸協議由TCP/IP換成了SSL/TLS,由”HTTP over TCP/IP“變成了”HTTP over SSL/TLS“,讓HTTP執行在了安全的SSL/TLS協議上,收發報文不再使用Socket API,而是呼叫專門的安全介面。

  

  所以說,其實HTTPS並沒有啥特別的地方,全是靠SSL/TLS來支援。我們只要學會了SSL/TLS,HTTPS自然就手到擒來了。

三、What is SSL/TLS

  SSL即安全套接層(Secure Sockets Layer),在OSI模型中處於第5層,也就是會話層,由網景公司於 1994 年發明,有 v2 和 v3 兩個版本,而 v1 因為有嚴重的缺陷從未公開過。

  SSL 發展到 v3 時已經證明了它自身是一個非常好的安全通訊協議,於是網際網路工程組 IETF 在 1999 年把它改名為 TLS(傳輸層安全,Transport Layer Security),正式標準化,版本號從 1.0 重新算起,所以 TLS1.0 實際上就是 SSLv3.1。

  到今天 TLS 已經發展出了三個版本,分別是 2006 年的 1.1、2008 年的 1.2 和2018年的 1.3,每個新版本都緊跟密碼學的發展和網際網路的現狀,持續強化安全和效能,已經成為了資訊保安領域中的權威標準。

  目前應用的最廣泛的 TLS 是 1.2,而之前的協議(TLS1.1/1.0、SSLv3/v2)都已經被認為是不安全的,各大瀏覽器即將在 2020 年左右停止支援,所以接下來的講解都針對的是 TLS1.2。

  TLS 由記錄協議、握手協議、警告協議、變更密碼規範協議、擴充套件協議等幾個子協議組成,綜合使用了對稱加密、非對稱加密、身份認證等許多密碼學前沿技術。

  瀏覽器和伺服器在使用 TLS 建立連線時需要選擇一組恰當的加密演算法來實現安全通訊,這些演算法的組合被稱為“密碼套件”(cipher suite,也叫加密套件)。

  其實 TLS 的密碼套件命名非常規範,格式很固定。基本的形式是“金鑰交換演算法 + 簽名演算法 + 對稱加密演算法 + 摘要演算法”,比如”ECDHE-RSA-AES256-GCM-SHA384“的密碼套件的意思就是:

  “握手時使用 ECDHE 演算法進行金鑰交換,用 RSA 簽名和身份認證,握手後的通訊使用 AES 對稱演算法,金鑰長度 256 位,分組模式是 GCM,摘要演算法 SHA384 用於訊息認證和產生隨機數。”

四、還要說一下OpenSSL

  聊完了TLS,我們就不得不談一下OpenSSL,它是一個著名的開源密碼學程式庫和工具包,幾乎支援所有公開的加密演算法和協議,已經成為了事實上的標準,許多應用軟體都會使用它作為底層庫來實現 TLS 功能,包括常用的 Web 伺服器 Apache、Nginx 等。

  OpenSSL 是從另一個開源庫 SSLeay 發展出來的,曾經考慮命名為“OpenTLS”,但當時(1998 年)TLS 還未正式確立,而 SSL 早已廣為人知,所以最終使用了“OpenSSL”的名字。

  由於 OpenSSL 是開源的,所以它還有一些程式碼分支,比如 Google 的 BoringSSL、OpenBSD 的 LibreSSL,這些分支在 OpenSSL 的基礎上刪除了一些老舊程式碼,也增加了一些新特性,雖然背後有“大金主”,但離取代 OpenSSL 還差得很遠。

五、小結

  本篇,最重要的就是安全通訊的四大特性,這個東西大家一定要記住,我們後面的學習都是基於此的TLS實現。我們還了解了其實HTTPS的核心就是S,而S的核心就是SSL和TLS,而SSL又是TLS的前身,所以根本的學習,就來到了TLS。

  而OpenSSL就是TLS的具體實現。

相關文章