通俗講解 HTTPS

yzbyzz發表於2018-04-27

為什麼要用 HTTPS

HTTP 是明文傳輸,任何人都能竊聽到,甚至篡改。

HTTPS 可以有效防止竊聽和篡改,能極大提高網站的安全性。

HTTPS 如何保障安全性

加密傳輸資料

HTTPS 會先將資料進行加密再傳輸,在網路中傳輸的時候任何人都只能捕獲到加密後的資料。而只有擁有相應的祕鑰才能解開資料。

那這裡就有了新的問題:資料要怎麼加密,用哪種加密方法來加密,客戶端和服務端怎麼協商確定祕鑰,同時保證祕鑰不被第三方所知道。

對稱加密與非對稱加密

先簡單介紹兩種加密的方式:對稱加密和非對稱加密。

顧名思義,對稱加密就是加密和解密時使用的是相同的祕鑰,優點是速度快。缺點是任意兩個通訊的實體之間都要維護他們彼此間通訊的祕鑰,而維護這麼多的祕鑰的成本太大了。

非對稱加密就是加密和解密使用的是不同的祕鑰,分別稱之為公鑰和私鑰。公鑰可以公開出來讓所有人知道;私鑰必須儲存好,不能讓其他人知道。非對稱加密的特點是用公鑰加密的資料只能用私鑰解密,用私鑰加密的資料只能用公鑰解密。缺點是速度慢。

於是,我們可以這樣操作:

客戶端隨機生成一個祕鑰 A,使用服務端的公鑰加密後傳送給服務端。
服務端收到後,用自己的私鑰進行解密獲得 A。
服務端告訴客戶端自己已經獲得了 A。
這樣客戶端和服務端就都得到了一個祕鑰 A,且不為其他人所知。
祕鑰 A 只在本次通訊過程中有效。

隨後客戶端每次傳送資料前,都用祕鑰 A 進行對稱加密,服務端收到後都用祕鑰 A 進行解密。
服務端傳送資料給客戶端時,也採用類似的操作。
複製程式碼

通過這樣的操作,我們利用非對稱加密來達到協商和確定好對稱加密的祕鑰 A,同時又利用了對稱加密速度快的特點。

實際上 HTTPS 協商祕鑰 A 的過程會比這個更復雜。但本質都是利用非對稱加密來達到協商的目的。

這裡實際上就有了一個新的問題:客戶端怎麼拿到服務端的公鑰,同時確保這就是服務端的公鑰而不是其他人偽造的。

HTTPS 證書

當我們訪問一個 HTTPS 的網站時,服務端會下發一個 HTTPS 證書給我們。證書裡面就包含了服務端的公鑰,同時還有其他資訊:證書所屬的域名、頒發的機構、何時生效、何時過期等。

那現在問題就是我們如何確認一個證書是不是有效的,而且是不是我們訪問的服務端發給我們的。

這裡就牽扯到了 HTTPS 證書的生成。

簡單說明一下 CA(證書頒發機構),CA 專門管理證書的申請和頒發。

申請證書的過程如下:

服務端向 CA 申請自己的 HTTPS 證書,
CA 稽核通過後,就會將服務端的域名、公鑰、證書的有效期等資訊寫到證書裡。
同時 CA 會對證書裡的資訊做一個雜湊獲得一個雜湊值,
用自己的祕鑰對這個雜湊值進行加密獲得一個加密串,
並把加密串也寫到證書裡。這一過程稱之為簽名。
(簽名就是證明這證書的確是 CA 發的,CA 為證書進行背書。)

現在,當我們訪問網站後收到一個證書時,
首先用 CA 的公鑰對加密串進行解密,得到加密前的雜湊值。
再對證書本身的資料做一個雜湊,如果這兩個雜湊值是一致的說明證書有效。
同時還要注意證書是否在有效期內。
通過以上校驗,我們就可以認為這的確是我們期望的服務端下發的證書。

假設有人偽造了證書,假裝自己是服務端,
由於他沒有 CA 的祕鑰,也就無法構造出與偽造資料吻合的加密串。
我們只要用 CA 的公鑰對加密串一解密,發現雜湊值不一致,就可以認定這是偽造的。
複製程式碼

這裡又牽出了新的問題:我們怎麼拿到 CA 的公鑰。

全球只有為數不多的幾個頂級 CA 有資格進行 HTTPS 證書的頒發。

所以作業系統和瀏覽器會預裝這些 CA 的證書(包含了 CA 的公鑰)。也就省去我們獲取 CA 公鑰的步驟和獲取過程可能存在的偽造。

這裡也可以看出 CA 證書是多麼重要。如果我們電腦中安裝了惡意的 CA 證書,而這個 CA 又故意或無意簽發了大量惡意服務端的證書,那我們即便使用了 HTTPS 也無法保證安全通訊。

客戶端證書

大部分時候,我們都是從服務端拿資料,所以主要保證服務端是我們要訪問的,也就是服務端要配置 HTTPS 證書。

如果為了讓服務端確認客戶端的確是誰,在大多數情況下使用“賬號+密碼”或“手機號+簡訊驗證碼”已經足夠了。

為每個客戶端都配置 HTTPS 證書,一個是申請證書本身需要費用;一個是申請的門檻較高,不是每個使用者都能做到。

也因此,只要服務端配置了 HTTPS 證書,在大多數情況下已經足夠安全了。

但是,對於某些對安全性要求極高的網站來說,他們也會要求客戶端要安裝 HTTPS 證書。

比如銀行網上轉賬就是一個十分敏感的操作。通常在我們申請銀行卡的時候會得到一個 U 盾。

U 盾裡面實際上也是一個 HTTPS 證書,用於證明“我就是我”。

只是這個證書是由銀行自己頒發的。(實際上要像 CA 那樣釋出證書是很容易的,但是隻有少數權威的 CA 才被作業系統和瀏覽器所認可。)

當我們要進行網上轉賬的時候,就必須把 U 盾插入到電腦上,訪問銀行的相關網站時,就會把 U 盾中的證書帶上去。

銀行的服務端在收到我們的證書,就用自己的私鑰進行解密,也就能確認我們的身份了。

Ref

深入淺出 HTTPS

相關文章