為什麼 SSL 證書能保證傳輸內容安全不被監聽?

看了網上的介紹,我總覺得並不安全啊,雖說最終有對內容加密,但是之前建立起加密 token 的過程內容不都可以被監聽從而導致加密內容被破解么。


嚴格來說,證書保護的不是通信內容,而是保護了通信雙方的認證,保證雙方是你確實想通信的對端而不是其他人偽冒。

在認證的結束時,通信雙方可以共享一個或幾個秘密不被其他任何人獲知。這個秘密才是通信內容的機密性和完整性保護的密鑰。這樣才能確保接下來的通信保護,不被第三方偷聽篡改偽冒。

具體認證和密鑰協商有很嚴格的流程,基本原理很簡單,就是用公鑰加密一個密鑰發給對端,只有私鑰擁有者才能解密出這個信息,中間人不行。


即便你竊聽到了所有的傳輸信息,那麼你還是不能破解加密的信息。

這是非對稱加密演算法存在的意義。它是基於數學原理的:

http://zh.wikipedia.org/wiki...

公鑰與密鑰的產生

假設 Alice 想要通過一個不可靠的媒體接收 Bob 的一條私人訊息。她可以用以下的方式來產生一個公鑰和一個私鑰

  1. 隨意選擇兩個大的質數pqp不等於q,計算N=pq

  2. 根據歐拉函數,不大於N且與N互質的整數個數為(p-1)(q-1)

  3. 選擇一個整數e與(p-1)(q-1)互質,並且e小於(p-1)(q-1)

  4. 用以下這個公式計算d:(d * e) ≡ 1 (mod ((p-1)(q-1)) )

  5. pq的記錄銷毀。

(N,e)是公鑰,(N,d)是私鑰。(N,d)是秘密的。Alice將她的公鑰(N,e)傳給Bob,而將她的私鑰(N,d)藏起來。

這個演算法是不可逆的,你知道了 (N,e),不可能(複雜度足夠高)計算出(N,d).

關鍵有一點:發送信息的時候使用的是 接收方的公鑰 ,這樣加密的信息只有對應的私鑰可以解開。

你監聽了密鑰交換的過程,只能獲得公鑰而不可能獲得私鑰(除非採用各種方式破解),因此你只知道鎖上箱子的辦法而沒有打開箱子的辦法。所以它是安全的。


因為證書可以用來加密客戶端與服務端的通信內容,中間人就無法監聽。

但引出一個新問題:中間人能否騙客戶端說自己是服務端?答案是不行。因為證書體系中,服務端有私鑰,可以用來簽名。中間人沒有私鑰,因此無法簽名。客戶端可以使用證書(公鑰)來驗證到底是不是服務端簽的名。如果是中間人代替簽名,會被發現。

所以中間人無法監聽。

但有一個問題,中間人可以向服務端冒充是自己是客戶端,前期是必須阻斷客戶端的連接。也就是說,中間人向服務端冒充自己是客戶端,服務端無法發現,繼續和中間人通信。客戶端是可以發現連接被阻斷。為了防止這個問題,服務端必須擁有客戶端事先註冊的賬號。比如服務端保存有客戶端的QQ號與密碼,接著客戶端需要使用QQ號與密碼進行登錄,登錄後才能進行其他操作。因為中間人無法監聽,所以無法得知客戶端的QQ號與密碼,當服務端向中間人冒充的客戶端詢問賬號時,中間人就被服務端發現是冒充的了。但這裡有一個問題,如果服務端不需要客戶端登錄或進行賬號驗證,那麼中間人就可以一直冒充客戶端而不被服務端發現了。不過,如果服務端不需要客戶端登錄或進行賬號驗證,估計這業務並不重要,因此中間人就算冒充客戶端,也只能得到公開的低價值信息。

以上都只是理論,然而現實情況是:

即使真的有了中間人在監聽客戶端與服務端的通信內容,接著客戶端的瀏覽器會給出警告,大部分不明真相的群眾依然會點擊【俺知道繼續訪問網站有風險,但麻煩瀏覽器大哥不要阻攔,俺要繼續訪問】。一旦用戶點擊了這個按鈕,中間人就監聽到數據了。

所以,不作死能活得好好的,作死就沒辦法。


有人挖墳讓我看見了,我也來答一個。

以 HTTPS 網站為例。

有的新人看到 HTTPS 有公鑰和私鑰,而公鑰是公開的,就以為「既然公鑰是所有人都可以得到的,那中間人也可以得到,那中間人自然也可以監聽到內容」,實則不然。

首先我們要知道,公鑰和私鑰,公鑰加密的內容公鑰不能解只有私鑰可以解,私鑰加密的內容私鑰不能解只有公鑰可以解。這就可以確保密鑰協商過程是安全的了。

也就是說,公鑰和私鑰本身不是用來加密內容的,是用來協商演算法和 TOKEN 的。

大概流程如下:

1、客戶端訪問網站(通知伺服器)

2、伺服器返回公鑰、加密演算法、隨機數等

3、客戶端使用公鑰加密 TOKEN 發送給伺服器

4、伺服器確認並使用 TOKEN 加密內容返回給客戶端

5、客戶端發送內容給伺服器同樣使用 TOKEN 加密

請注意第3步,客戶端用公鑰加密的 TOKEN 只有私鑰才可以解,而私鑰只有伺服器自己才有,所以只有公鑰的竊聽者是不可能解出 TOKEN 是什麼的,之後的加密內容只要使用 TOKEN 加密即可。

那麼,問題來了,如果有一個竊聽者做起了中間人,從一開始就攔截請求,替你完成協商 TOKEN 的過程,然後再用自己的公鑰和私鑰來和你交換信息,此不是完全沒用了?

這個時候,證書籤發機構就要上場了,可信CA讓客戶端確認密鑰證書真實性

註:可信CA的意思是,簽發機構不會給未經驗證身份的用戶簽發證書。比如說我想申請 http://zhihu.com 的證書我就得證明我是 http://zhihu.com 的所有者。當然,簽發機構是不是可信,需要得到客戶端(如谷歌瀏覽器)的認可。

中間人要想實現竊聽,必然要替換真正的證書,因為客戶端用真正的證書公鑰來加密 TOKEN 發送給伺服器,中間人沒有私鑰是破解不了的。

所以,只要有一個可信CA名單,客戶端在協商 TOKEN 之前先確認一下證書是否真實,就可以防止中間人了。

大概流程如下:

1、客戶端訪問網站(通知伺服器)

2、伺服器返回公鑰、加密演算法、隨機數等

3、客戶端確認公鑰證書由可信機構簽發且有效(如果不是,則中止訪問並警告可能存在監聽)

4、客戶端使用公鑰加密 TOKEN 發送給伺服器

5、伺服器確認並使用 TOKEN 加密內容返回給客戶端

6、客戶端發送內容給伺服器同樣使用 TOKEN 加密

總的來說,原理是這麼回事。真正的握手過程比我寫的要複雜得多。

最後回答一個非常常見的新人喜歡問的問題:如果證書泄露了呢?

這麼會假設,你咋不上天呢?證書就相當於用於指紋解鎖的手指,你連手指都可以丟,還談什麼安全呢。


簡單的書,伺服器只分發公鑰,私鑰則保存在服務端。服務端可信的前提下,非對稱加密機制保證了私鑰不能(或非常難)被猜解(數學上證明)。從而保證了傳輸內容的機密性。


之前我也一直好奇這個問題。。

SSL傳輸的基本過程是這樣的。http://leo-dream.iteye.com/blog/313592

服務端給客戶端公鑰。

客戶端生成"預備主密碼"。並用收到的公鑰加密發送給服務端。注意這裡只有服務端擁有的私鑰才能解密出來。

這樣"預備主密碼"就只有客戶端和服務端知道了。

但是。。這對中間人攻擊完全無效。SSL防止中間人攻擊完全依賴於證書。。只要證書在服務端的密鑰安全。客戶端拿到的公鑰沒被替換。。那就是安全的。


推薦閱讀:

不同地區的婚姻登記信息為什麼不聯網?
這是一個「體驗大於功能的時代」,你是怎麼看待的?
Joy Neop 是誰?
如何看待蕭井陌在 B 站直播寫代碼的行為?
有哪些精彩的互聯網產品名字?

TAG:互聯網 | SSL | 計算機網路 | HTTP |