最近在調試一個bug的時候沒有其它好的辦法了,用到了抓包這麼個方式才發現問題,不過問題已經解決了nginx
不過在抓包的時候忽然想到了,我擦,我用的https也能夠被抓到包啊。因此又看了一下https的連接創建的流程(SSL/TLS原理詳解)和相關的中間人攻擊的流程,想了一下其中的原理。segmentfault
首先介紹一下在https創建的過程當中是如何被中間人抓到包的吧,前提是若是不熟悉https創建鏈接的過程,先看一下相關資料再接着看本文安全
1.客戶端首先要向遠程的服務器發送創建鏈接的請求,並帶有本身的支持的加解密的方式級別,這個過程通過了中間人的竊聽,中間人把消息修改後發給了真正的目的地——服務端服務器
2.服務端收到了要創建https連接的請求後,會發送當時從證書籤發機構簽發的公鑰證書。這個過程當中中間人又竊聽了,而後中間人替換上本身的證書後又轉發給了客戶端。app
3.客戶端收到了中間人發過來的公鑰證書,驗證證書的真僞,併產生隨機的對稱加密的密鑰,用中間人發的公鑰加密後發給了中間人。因爲剛纔客戶端收到的公鑰證書自己就是中間人產生的,因此中間人用相應的私鑰就解開了,拿到了客戶端產生的那個隨機產生的對稱加密密鑰。中間人再用剛纔服務端返回的公鑰證書加密這個客戶端產生的用來對稱加密的密鑰,發給服務端。運維
4.服務端收到了當時用本身下發的公鑰的證書加密的對稱加密密鑰,用本身的私鑰解密,也獲得了對稱加密的密鑰。工具
之後的通訊都使用這個對稱加密的密鑰加密了。由於客戶端,中間人,服務端都有了這個對稱加密的密鑰,因此均可以用此解密通訊的內容。(上面的步驟是穿插了HTTPS創建握手過程和中間人的做用介紹的,屬於簡潔介紹,明白原理就能夠了)。加密
上面有幾個字「驗證證書的真僞」標爲了紅色,其實通常來講這個過程應該是安全的,由於通常的證書都是由操做系統來管理(Firefox本身管理)的,因此只要操做系統沒有證書鏈驗證等方面的bug是沒有什麼問題的,可是爲了抓包其實咱們是在操做系統中導入了中間人的CA,這樣中間人下發的公鑰證書就能夠被認爲是合法的,能夠經過驗證的(中間人既承擔了辦法了證書,又承擔了驗證證書,能不經過驗證嘛)。spa
忘了說了,這個抓包是很是全面的,就是能夠抓到你請求的參數,返回值均可以看的很是的清楚。操作系統
客戶端爲了解決這個問題,最好的方式其實就是內嵌證書,比對一下這個證書究竟是不是本身真正的「服務端」發來的,而不是中間被替換了。下面就介紹一下解決的步驟吧:
1.問運維要到接口站點的證書(即當初證書機構簽完的那個放到nginx裏的公鑰證書),放到工程裏面就能夠,AF會自動去查找
2.AFNetworking設置如下代碼
AFSecurityPolicy * policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate]; _manager.securityPolicy = policy;
AF的安全策略會自動的在bundle裏面查找公鑰證書,創建https的時候進行比對。不同直接就失敗了。
PS:順帶介紹一下AF的AFSSLPinningMode的三個級別
AFSSLPinningModeNone: (默認級別),客戶端無條件信任任何下發的公鑰證書
AFSSLPinningModePublicKey: 客戶端本地去驗證服務端下發的公鑰證書的 public keys部分。若是正確才經過
AFSSLPinningModeCertificate: 客戶端本地去驗證服務端下發的公鑰證書的全部部分。若是正確才經過
這樣作了以後,就能夠即便手機上安裝了抓包工具的CA,抓包工具也不能抓到包了。由於你的客戶端在驗證「服務端」下發的公鑰證書的真僞的時候就不會經過「中間人」下發的公鑰證書,也就不會創建起來https的鏈接了。
其實使用了https,而且在系統沒有被攻破或者有證書漏洞的時候就能保證通訊過程的安全了。可是這樣能夠更近一步,以防止競爭對手抓取大家的數據之類的,畢竟數據被別人抓走了老是很差的。在寫這個博文的時候嘗試了一下能夠被中間人抓包工具抓到完整包的有不少,知乎,貼吧,等好多。可是銀行的金融類app就抓不到,相對的安全了不少了。
---------------第一次更新分割線--------------
今天上午的時候忽然又想到了一個方式,那就是工程打包進去證書機構的CA,強制使用這個CA去驗證證書。這樣就能夠沒必要使用公鑰證書的驗證方式了。
可是我尚未親自實驗這個。
理論上來講這種方式可能有如下優勢:
1.移動應用的分發不是實時的,通常申請的公鑰證書都是1到3年的有效期,快到期的時候可能要在工程裏面同時內置兩個公鑰證書。
2.有的狀況下,圖片服務器或者其它的服務器可能使用的域名是不同的,而且這些不一樣的域名使用的不是同一個公鑰證書,這樣也會有同時內置多個公鑰證書。若是此時再趕上第一點的狀況可能公鑰證書的數量要翻倍了。
3.通常公司大多數狀況下可能有不少的域名,可是通常申請證書的時候都去同一個證書機構申請了,這樣只須要內置一個這個證書機構的CA就能夠了。
4.證書機構的CA有效期通常都好幾十年,有點一勞永逸的傾向。(主要仍是懶~~~~~~)