本文摘錄參考:
- 細說 CA 和證書(主要講解 CA 的使用)
- 數字簽名是什么?(簡單理解原理)
- 深入淺出 HTTPS 工作原理(深入理解原理)
HTTP 協議由於是明文傳送,所以存在三大風險:
- 1、被竊聽的風險:第三方可以截獲並查看你的內容
- 2、被篡改的危險:第三方可以截獲並修改你的內容
- 3、被冒充的風險:第三方可以偽裝成通信方與你通信
HTTP 因為存在以上三大安全風險,所以才有了 HTTPS 的出現。
HTTPS 涉及到了很多概念,比如 SSL/TSL,數字證書、數字簽名、加密、認證、公鑰和私鑰等,比較容易混淆。我們先從一次簡單的安全通信故事講起吧,其中穿插復習一些密碼學的概念。
一、關於 Bob 與他好朋友通信的故事
這個故事的原文是:
http://www.youdzone.com/signature.html
阮一峰老師也翻譯過:
http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html
這里重新敘述一下這個故事:
故事的主人公是 Bob,他有三個好朋友 Pat、Doug 和 Susan。Bob 經常跟他們寫信,因為他的信是明文傳輸的,在傳遞過程可能被人截獲偷窺,也可能被人截獲然后又篡改了,更有可能別人偽裝成 Bob 本人跟他的好朋友通信,總之是不安全的。他很苦惱,經過一番苦苦探索,誒,他發現計算機安全學里有一種叫非對稱加密算法的東東,好像可以幫助他解決這個問題。
說明:非對稱加密算法(RSA)是內容加密的一類算法,它有兩個秘鑰:公鑰與私鑰。公鑰是公開的鑰匙,所有人都可以知道,私鑰是保密的,只有持有者知道。通過公鑰加密的內容,只能通過私鑰解開。非對稱加密算法的安全性很高,但是因為計算量龐大,比較消耗性能。
好了,來看看 Bob 是怎么應用非對稱加密算法與他的好朋友通信的:
1、首先 Bob 弄到了兩把鑰匙:公鑰和私鑰;
2、Bob 自己保留下了私鑰,把公鑰復制成三份送給了他的三個好朋友 Pat、Doug 和 Susan;
3、此時,Bob 總算可以安心地和他的好朋友愉快地通信了。比如 Susan 要和他討論關於去哪吃午飯的事情,Susan 就可以先把自己的內容(明文)首先用 Bob 送給他的公鑰做一次加密,然后把加密的內容傳送給 Bob。Bob 收到信后,再用自己的私鑰解開信的內容;
說明:這其實是計算機安全學里加密的概念,加密的目的是為了不讓別人看到傳送的內容,加密的手段是通過一定的加密算法及約定的密鑰進行的(比如上述用了非對稱加密算法以及 Bob 的公鑰),而解密則需要相關的解密算法及約定的秘鑰(如上述用了非對稱加密算法和 Bob 自己的私鑰),可以看出加密是可逆的(可解密的)。
4、Bob 看完信后,決定給 Susan 回一封信。為了防止信的內容被篡改(或者別人偽裝成他的身份跟 Susan 通信),他決定先對信的內容用 hash 算法做一次處理,得到一個字符串哈希值,Bob 又用自己的私鑰對哈希值做了一次加密得到一個簽名,然后把簽名和信(明文的)一起發送給 Susan;
說明 2:Bob 的內容實質是明文傳輸的,所以這個過程是可以被人截獲和窺探的,但是 Bob 不擔心被人窺探,他擔心的是內容被人篡改或者有人冒充自己跟 Susan 通信。這里其實涉及到了計算機安全學中的認證概念,Bob 要向 Susan 證明通信的對方是 Bob 本人,另外也需要確保自己的內容是完整的。
5、Susan 接收到了 Bob 的信,首先用 Bob 給的公鑰對簽名作了解密處理,得到了哈希值 A,然后 Susan 用了同樣的 Hash 算法對信的內容作了一次哈希處理,得到另外一個哈希值 B,對比 A 和 B,如果這兩個值是相同的,那么可以確認信就是 Bob 本人寫的,並且內容沒有被篡改過;
說明:4 跟 5 其實構成了一次完整的通過數字簽名進行認證的過程。數字簽名的過程簡述為:發送方通過不可逆算法對內容 text1 進行處理(哈希),得到的結果值 hash1,然后用私鑰加密 hash1 得到結果值 encry1。對方接收 text1 和 encry1,用公鑰解密 encry1 得到 hash1,然后用 text1 進行同等的不可逆處理得到 hash2,對 hash1 和 hash2 進行對比即可認證發送方。
6、此時,另外一種比較復雜出現了,Bob 是通過網絡把公鑰寄送給他的三個好朋友的,有一個不懷好意的家伙 Jerry 截獲了 Bob 給 Doug 的公鑰。Jerry 開始偽裝成 Bob 跟 Doug 通信,Doug 感覺通信的對象不像是 Bob,但是他又無法確認;
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 為密鑰使用之前約定好的解密算法獲取網頁內容。
備注 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 兩個模塊,后者負責握手過程中的身份認證,前者則保證數據傳輸過程中的完整性和私密性。