天天看點

深入淺出 HTTPS 工作原理

HTTP 協定由于是明文傳送,是以存在三大風險:

1、被竊聽的風險:第三方可以截獲并檢視你的内容

2、被篡改的危險:第三方可以截獲并修改你的内容

3、被冒充的風險:第三方可以僞裝成通信方與你通信

HTTP 因為存在以上三大安全風險,是以才有了 HTTPS 的出現。

HTTPS 涉及到了很多概念,比如 SSL/TSL,數字證書、數字簽名、加密、認證、公鑰和私鑰等,比較容易混淆。我們先從一次簡單的安全通信故事講起吧,其中穿插複習一些密碼學的概念。

這個故事的原文是:

http://www.youdzone.com/signature.html

阮一峰老師也翻譯過:

http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html

(不過阮老師裡面沒有很好的區分加密和認證的概念,以及最後 HTTPS 的說明不夠嚴謹,評論區的針對這些問題的讨論比較激烈,挺有意思的)

這裡重新叙述一下這個故事:

故事的主人公是 Bob,他有三個好朋友 Pat、Doug 和 Susan。Bob 經常跟他們寫信,因為他的信是明文傳輸的,在傳遞過程可能被人截獲偷窺,也可能被人截獲然後又篡改了,更有可能别人僞裝成 Bob 本人跟他的好朋友通信,總之是不安全的。他很苦惱,經過一番苦苦探索,诶,他發現計算機安全學裡有一種叫非對稱加密算法的東東,好像可以幫助他解決這個問題

說明:非對稱加密算法(RSA)是内容加密的一類算法,它有兩個秘鑰:公鑰與私鑰。公鑰是公開的鑰匙,所有人都可以知道,私鑰是保密的,隻有持有者知道。通過公鑰加密的内容,隻能通過私鑰解開。非對稱加密算法的安全性很高,但是因為計算量龐大,比較消耗性能。

好了,來看看 Bob 是怎麼應用非對稱加密算法與他的好朋友通信的:

1、首先 Bob 弄到了兩把鑰匙:公鑰和私鑰;

深入淺出 HTTPS 工作原理

2、Bob 自己保留下了私鑰,把公鑰複制成三份送給了他的三個好朋友 Pat、Doug 和 Susan;

深入淺出 HTTPS 工作原理

3、此時,Bob 總算可以安心地和他的好朋友愉快地通信了。比如 Susan 要和他讨論關于去哪吃午飯的事情,Susan 就可以先把自己的内容(明文)首先用 Bob 送給他的公鑰做一次加密,然後把加密的内容傳送給 Bob。Bob 收到信後,再用自己的私鑰解開信的内容;

深入淺出 HTTPS 工作原理

說明:這其實是計算機安全學裡加密的概念,加密的目的是為了不讓别人看到傳送的内容,加密的手段是通過一定的加密算法及約定的密鑰進行的(比如上述用了非對稱加密算法以及 Bob 的公鑰),而解密則需要相關的解密算法及約定的秘鑰(如上述用了非對稱加密算法和 Bob 自己的私鑰),可以看出加密是可逆的(可解密的)。

4、Bob 看完信後,決定給 Susan 回一封信。為了防止信的内容被篡改(或者别人僞裝成他的身份跟 Susan 通信),他決定先對信的内容用 hash 算法做一次處理,得到一個字元串哈希值,Bob 又用自己的私鑰對哈希值做了一次加密得到一個簽名,然後把簽名和信(明文的)一起發送給 Susan;

深入淺出 HTTPS 工作原理
深入淺出 HTTPS 工作原理
深入淺出 HTTPS 工作原理

說明 2:Bob 的内容實質是明文傳輸的,是以這個過程是可以被人截獲和窺探的,但是 Bob 不擔心被人窺探,他擔心的是内容被人篡改或者有人冒充自己跟 Susan 通信。這裡其實涉及到了計算機安全學中的認證概念,Bob 要向 Susan 證明通信的對方是 Bob 本人,另外也需要確定自己的内容是完整的。

5、Susan 接收到了 Bob 的信,首先用 Bob 給的公鑰對簽名作了解密處理,得到了哈希值 A,然後 Susan 用了同樣的 Hash 算法對信的内容作了一次哈希處理,得到另外一個哈希值 B,對比 A 和 B,如果這兩個值是相同的,那麼可以确認信就是 Bob 本人寫的,并且内容沒有被篡改過;

深入淺出 HTTPS 工作原理

說明:4 跟 5 其實構成了一次完整的通過數字簽名進行認證的過程。數字簽名的過程簡述為:發送方通過不可逆算法對内容 text1 進行處理(哈希),得到的結果值 hash1,然後用私鑰加密 hash1 得到結果值 encry1。對方接收 text1 和 encry1,用公鑰解密 encry1 得到 hash1,然後用 text1 進行同等的不可逆處理得到 hash2,對 hash1 和 hash2 進行對比即可認證發送方。

6、此時,另外一種比較複雜出現了,Bob 是通過網絡把公鑰寄送給他的三個好朋友的,有一個不懷好意的家夥 Jerry 截獲了 Bob 給 Doug 的公鑰。Jerry 開始僞裝成 Bob 跟 Doug 通信,Doug 感覺通信的對象不像是 Bob,但是他又無法确認;

深入淺出 HTTPS 工作原理

7、Bob 最終發現了自己的公鑰被 Jerry 截獲了,他感覺自己的公鑰通過網絡傳輸給自己的小夥伴似乎也是不安全的,不懷好意的家夥可以截獲這個明文傳輸的公鑰。為此他想到了去第三方權威機構"證書中心"(certificate authority,簡稱 CA)做認證。證書中心用自己的私鑰對 Bob 的公鑰和其它資訊做了一次加密。這樣 Bob 通過網絡将數字證書傳遞給他的小夥伴後,小夥伴們先用 CA 給的公鑰解密證書,這樣就可以安全擷取 Bob 的公鑰了。

深入淺出 HTTPS 工作原理

通過 Bob 與他的小夥伴的通信,我們已經可以大緻了解一個安全通信的過程,也可以了解基本的加密、解密、認證等概念。HTTPS 就是基于這樣一個邏輯設計的。

首先看看組成 HTTPS 的協定:HTTP 協定和 SSL/TSL 協定。HTTP 協定就不用講了,而 SSL/TSL 就是負責加密解密等安全處理的子產品,是以 HTTPS 的核心在 SSL/TSL 上面。整個通信如下:

1、浏覽器發起往伺服器的 443 端口發起請求,請求攜帶了浏覽器支援的加密算法和雜湊演算法。

2、伺服器收到請求,選擇浏覽器支援的加密算法和雜湊演算法。

3、伺服器下将數字證書傳回給浏覽器,這裡的數字證書可以是向某個可靠機構申請的,也可以是自制的。

4、浏覽器進入數字證書認證環節,這一部分是浏覽器内置的 TSL 完成的:

4.1 首先浏覽器會從内置的證書清單中索引,找到伺服器下發證書對應的機構,如果沒有找到,此時就會提示使用者該證書是不是由權威機構頒發,是不可信任的。如果查到了對應的機構,則取出該機構頒發的公鑰。

4.2 用機構的證書公鑰解密得到證書的内容和證書簽名,内容包括網站的網址、網站的公鑰、證書的有效期等。浏覽器會先驗證證書簽名的合法性(驗證過程類似上面 Bob 和 Susan 的通信)。簽名通過後,浏覽器驗證證書記錄的網址是否和目前網址是一緻的,不一緻會提示使用者。如果網址一緻會檢查證書有效期,證書過期了也會提示使用者。這些都通過認證時,浏覽器就可以安全使用證書中的網站公鑰了。

4.3 浏覽器生成一個随機數 R,并使用網站公鑰對 R 進行加密。

5、浏覽器将加密的 R 傳送給伺服器。

6、伺服器用自己的私鑰解密得到 R。

7、伺服器以 R 為密鑰使用了對稱加密算法加密網頁内容并傳輸給浏覽器。

8、浏覽器以 R 為密鑰使用之前約定好的解密算法擷取網頁内容。

深入淺出 HTTPS 工作原理

備注 1:前 5 步其實就是 HTTPS 的握手過程,這個過程主要是認證服務端證書(内置的公鑰)的合法性。因為非對稱加密計算量較大,整個通信過程隻會用到一次非對稱加密算法(主要是用來保護傳輸用戶端生成的用于對稱加密的随機數私鑰)。後續内容的加解密都是通過一開始約定好的對稱加密算法進行的。

備注 2:SSL/TLS 是 HTTPS 安全性的核心子產品,TLS 的前身是 SSL,TLS1.0 就是 SSL3.1,TLS1.1 是 SSL3.2,TLS1.2 則是 SSL3.3。 SSL/TLS 是建立在 TCP 協定之上,因而也是應用層級别的協定。其包括 TLS Record Protocol 和 TLS Handshaking Protocols 兩個子產品,後者負責握手過程中的身份認證,前者則保證資料傳輸過程中的完整性和私密性。