移動安全-iOS(三)

網絡通訊

咱們知道無線傳輸的數據能被第三方輕易截獲(如使用抓包工具Charles),若是未使用加密措施,可能直接暴露用戶的各類關鍵數據,例如用戶名,密碼等。加入了SSL(Secure Socket Layer)子層實現的HTTPS協議可確保數據在網絡上加密傳輸,即便傳輸的數據被截獲,也沒法解密和還原。html

http不使用SSL/TLS的HTTP通訊,就是不加密的通訊。全部信息明文傳播,帶來了三大風險。算法

  • 1 竊聽風險(eavesdropping):第三方能夠獲知通訊內容。
  • 2 篡改風險(tampering):第三方能夠修改通訊內容。
  • 3 冒充風險(pretending):第三方能夠冒充他人身份參與通訊。

SSL/TLS協議是爲了解決這三大風險而設計的,但願達到:windows

  • 全部信息都是加密傳播,第三方沒法竊聽。
  • 具備校驗機制,一旦被篡改,通訊雙方會馬上發現。
  • 配備身份證書,防止身份被冒充。

互聯網是開放環境,通訊雙方都是未知身份,這爲協議的設計帶來了很大的難度。並且,協議還必須可以經受全部匪夷所思的攻擊,這使得SSL/TLS協議變得異常複雜。瀏覽器

基本的運行過程安全

SSL/TLS協議的基本思路是採用公鑰加密法,也就是說,客戶端先向服務器端索要公鑰,而後用公鑰加密信息,服務器收到密文後,用本身的私鑰解密。關於公鑰加密法bash

可是,這裏有兩個問題。

(1)如何保證公鑰不被篡改?服務器

解決方法:將公鑰放在數字證書中。只要證書是可信的,公鑰就是可信的。網絡

(2)公鑰加密計算量太大,如何減小耗用的時間?session

解決方法:每一次對話(session),客戶端和服務器端都生成一個"對話密鑰"(session key),用它來加密信息。因爲"對話密鑰"是對稱加密,因此運算速度很是快,而服務器公鑰只用於加密"對話密鑰"自己,這樣就減小了加密運算的消耗時間。工具

所以,SSL/TLS協議的基本過程是這樣的:

  • 客戶端向服務器端索要並驗證公鑰。
  • 雙方協商生成"對話密鑰"。
  • 雙方採用"對話密鑰"進行加密通訊。

上面過程的前兩步,又稱爲"握手階段"(handshake)。

4、握手階段的詳細過程

"握手階段"涉及四次通訊,咱們一個個來看。須要注意的是,"握手階段"的全部通訊都是明文的。

客戶端發出請求(ClientHello)

01 首先,客戶端(一般是瀏覽器)先向服務器發出加密通訊的請求,這被叫作ClientHello請求。 在這一步,客戶端主要向服務器提供如下信息

  • 支持的協議版本,好比TLS 1.0版。
  • 一個客戶端生成的隨機數,稍後用於生成"對話密鑰"。
  • 支持的加密方法,好比RSA公鑰加密。
  • 支持的壓縮方法。

這裏須要注意的是,客戶端發送的信息之中不包括服務器的域名。也就是說,理論上服務器只能包含一個網站,不然會分不清應該向客戶端提供哪個網站的數字證書。這就是爲何一般一臺服務器只能有一張數字證書的緣由。

** 服務器迴應(SeverHello)**

02 :服務器收到客戶端請求後,向客戶端發出迴應,這叫作SeverHello。服務器的迴應包含如下內容。

  • 確認使用的加密通訊協議版本,好比TLS 1.0版本。若是瀏覽器與服務器支持的版本不一致,服務器關閉加密通訊。
  • 一個服務器生成的隨機數,稍後用於生成"對話密鑰"。
  • (3) 確認使用的加密方法,好比RSA公鑰加密。
  • 服務器證書。

除了上面這些信息,若是服務器須要確認客戶端的身份,就會再包含一項請求,要求客戶端提供"客戶端證書"。好比,金融機構每每只容許認證客戶連入本身的網絡,就會向正式客戶提供USB密鑰,裏面就包含了一張客戶端證書。

03客戶端迴應

客戶端收到服務器迴應之後,首先驗證服務器證書。若是證書不是可信機構頒佈、或者證書中的域名與實際域名不一致、或者證書已通過期,就會向訪問者顯示一個警告,由其選擇是否還要繼續通訊。 若是證書沒有問題,客戶端就會從證書中取出服務器的公鑰。而後,向服務器發送下面三項信息。

  • 一個隨機數。該隨機數用服務器公鑰加密,防止被竊聽。
  • 編碼改變通知,表示隨後的信息都將用雙方商定的加密方法和密鑰發送。
  • 客戶端握手結束通知,表示客戶端的握手階段已經結束。這一項同時也是前面發送的全部內容的hash值,用來供服務器校驗。

上面第一項的隨機數,是整個握手階段出現的第三個隨機數,又稱"pre-master key"。有了它之後,客戶端和服務器就同時有了三個隨機數,接着雙方就用事先商定的加密方法,各自生成本次會話所用的同一把"會話密鑰"。 至於爲何必定要用三個隨機數,來生成"會話密鑰",dog250解釋得很好:

"不論是客戶端仍是服務器,都須要隨機數,這樣生成的密鑰纔不會每次都同樣。因爲SSL協議中證書是靜態的,所以十分有必要引入一種隨機因素來保證協商出來的密鑰的隨機性。 對於RSA密鑰交換算法來講,pre-master-key自己就是一個隨機數,再加上hello消息中的隨機,三個隨機數經過一個密鑰導出器最終導出一個對稱密鑰。 pre master的存在在於SSL協議不信任每一個主機都能產生徹底隨機的隨機數,若是隨機數不隨機,那麼pre master secret就有可能被猜出來,那麼僅適用pre master secret做爲密鑰就不合適了,所以必須引入新的隨機因素,那麼客戶端和服務器加上pre master secret三個隨機數一同生成的密鑰就不容易被猜出了,一個僞隨機可能徹底不隨機,但是是三個僞隨機就十分接近隨機了,每增長一個自由度,隨機性增長的可不是一。"
複製代碼

此外,若是前一步,服務器要求客戶端證書,客戶端會在這一步發送證書及相關信息。

04 服務器的最後迴應

服務器收到客戶端的第三個隨機數pre-master key以後,計算生成本次會話所用的"會話密鑰"。而後,向客戶端最後發送下面信息。

  • 編碼改變通知,表示隨後的信息都將用雙方商定的加密方法和密鑰發送。
  • 服務器握手結束通知,表示服務器的握手階段已經結束。這一項同時也是前面發送的全部內容的hash值,用來供客戶端校驗。

關於數字證書

該證書包含了公鑰等信息,通常是由服務器發給客戶端,接收方經過驗證這個證書是否是由信賴的CA簽發,或者與本地的證書相對比,來判斷證書是否可信;假如須要雙向驗證,則服務器和客戶端都須要發送數字證書給對方驗證;

數字證書是一個電子文檔,其中包含了持有者的信息、公鑰以及證實該證書有效的數字簽名。而數字證書以及相關的公鑰管理和驗證等技術組成了PKI(公鑰基礎設施)規範體系。通常來講,數字證書是由數字證書認證機構(Certificate authority,即CA)來負責簽發和管理,並承擔PKI體系中公鑰合法性的檢驗責任;數字證書的類型有不少,而HTTPS使用的是SSL證書。 怎麼來驗證數字證書是由CA簽發的,而不是第三方僞造的呢? 在回答這個問題前,咱們須要先了解CA的組織結構。首先,CA組織結構中,最頂層的就是根CA,根CA下能夠受權給多個二級CA,而二級CA又能夠受權多個三級CA,因此CA的組織結構是一個樹結構。對於SSL證書市場來講,主要被Symantec(旗下有VeriSign和GeoTrust)、Comodo SSL、Go Daddy 和 GlobalSign 瓜分。 瞭解了CA的組織結構後,來看看數字證書的簽發流程:

數字證書的簽發機構CA,在接收到申請者的資料後進行覈對並肯定信息的真實有效,而後就會製做一份符合X.509標準的文件。證書中的證書內容包含的持有者信息和公鑰等都是由申請者提供的,而數字簽名則是CA機構對證書內容進行hash加密後獲得的,而這個數字簽名就是咱們驗證證書是不是有可信CA簽發的數據。

假設上圖證書是由證書籤發機構CA1簽發的。

  • 接收端接到一份數字證書Cer1後,對證書的內容作Hash獲得H1;
  • 從簽發該證書的機構CA1的數字證書中找到公鑰,對證書上數字簽名進行解密,獲得證書Cer1簽名的Hash摘要H2;
  • 對比H1和H2,如相等,則表示證書沒有被篡改。
  • 但這個時候仍是不知道CA是不是合法的,咱們看到上圖中有CA機構的數字證書,這個證書是公開的,全部人均可以獲取到。而這個證書中的數字簽名是上一級生成的,因此能夠這樣一直遞歸驗證下去,直到根CA。根CA是自驗證的,即他的數字簽名是由本身的私鑰來生成的。合法的根CA會被瀏覽器和操做系統加入到權威信任CA列表中,這樣就完成了最終的驗證。因此,必定要保護好本身環境(瀏覽器/操做系統)中根CA信任列表,信任了根CA就表示信任全部根CA下全部子級CA所簽發的證書,不要隨便添加根CA證書。

通常操做系統和瀏覽器只包含根CA機構的證書,而在配置Web服務器的HTTPS時,也會將配置整個證書鏈,因此整個校驗流程是從最後的葉子節點證書開始,用父節點校驗子節點,一層層校驗整個證書鏈的可信性。

Basic Constraint校驗漏洞 那是否無論多少層均可以這樣一直信任下去呢?理論上是可行的,但會遇到一個問題。假設我從可信CA機構購買了一張證書,使用這張證書籤發的證書是否也會被操做系統和瀏覽器信任呢?明顯是不該該相信的,由於我並非CA機構,假如我簽發的證書也被信任的話,那我徹底能夠本身簽發任何域名的證書來進行僞造攻擊。這就是著名的Basic Constraint校驗漏洞,X.509證書中的Basic Constraint包含了這是否是一個CA機構,以及有效證書路徑的最大深度(即,這個CA還可否繼續簽發CA機構證書及其簽發子CA證書的路徑深度)。但在幾年前,包括微軟和Apple都爆出了沒有正確校驗這些信息的漏洞。

Basic Constraint信息請看下圖:

上圖是Google Internet Authority G2的證書,該證書是個CA機構證書;路徑深度爲0,表示該證書沒法再簽發CA證書,只能簽發客戶證書(client certificate)。
上圖是google.com的證書,這是個客戶證書(client certificate),不可再簽發子證書,因此由該證書籤發的子證書是不會被信任的。

以上是我對TLS的學習, 主要參考文章

阮一峯:SSL/TLS協議運行機制的概述

MicroSoft TechNet: MicroSoft TechNet,

The First Few Milliseconds of an HTTPS Connection :The First Few Milliseconds of an HTTPS Connection

Transport Layer Security: en.wikipedia.org/wiki/Transp…

stackChange :How does SSL/TLS work?

Jaminzzhang :iOS安全系列之一:HTTPS

相關文章
相關標籤/搜索