最近在調試一個bug的時候沒有其它好的辦法了,用到了抓包這么個方式才發現問題,不過問題已經解決了
不過在抓包的時候突然想到了,我擦,我用的https也可以被抓到包啊。所以又看了一下https的鏈接建立的流程(SSL/TLS原理詳解)和相關的中間人攻擊的流程,想了一下其中的原理。
首先介紹一下在https建立的過程中是如何被中間人抓到包的吧,前提是如果不熟悉https建立連接的過程,先看一下相關資料再接着看本文
1.客戶端首先要向遠程的服務器發送建立連接的請求,並帶有自己的支持的加解密的方式級別,這個過程經過了中間人的竊聽,中間人把消息修改后發給了真正的目的地——服務端
2.服務端收到了要建立https鏈接的請求后,會發送當時從證書簽發機構簽發的公鑰證書。這個過程中中間人又竊聽了,然后中間人替換上自己的證書后又轉發給了客戶端。
3.客戶端收到了中間人發過來的公鑰證書,驗證證書的真偽,並產生隨機的對稱加密的密鑰,用中間人發的公鑰加密后發給了中間人。由於剛才客戶端收到的公鑰證書本身就是中間人產生的,所以中間人用相應的私鑰就解開了,拿到了客戶端產生的那個隨機產生的對稱加密密鑰。中間人再用剛才服務端返回的公鑰證書加密這個客戶端產生的用來對稱加密的密鑰,發給服務端。
4.服務端收到了當時用自己下發的公鑰的證書加密的對稱加密密鑰,用自己的私鑰解密,也得到了對稱加密的密鑰。
以后的通信都使用這個對稱加密的密鑰加密了。因為客戶端,中間人,服務端都有了這個對稱加密的密鑰,所以都可以用此解密通信的內容。(上面的步驟是穿插了HTTPS建立握手過程和中間人的作用介紹的,屬於簡潔介紹,明白原理就可以了)。
上面有幾個字“驗證證書的真偽”標為了紅色,其實一般來說這個過程應該是安全的,因為一般的證書都是由操作系統來管理(Firefox自己管理)的,所以只要操作系統沒有證書鏈驗證等方面的bug是沒有什么問題的,但是為了抓包其實我們是在操作系統中導入了中間人的CA,這樣中間人下發的公鑰證書就可以被認為是合法的,可以通過驗證的(中間人既承擔了辦法了證書,又承擔了驗證證書,能不通過驗證嘛)。
忘了說了,這個抓包是非常全面的,就是可以抓到你請求的參數,返回值都可以看的非常的清楚。
客戶端為了解決這個問題,最好的方式其實就是內嵌證書,比對一下這個證書到底是不是自己真正的“服務端”發來的,而不是中間被替換了。下面就介紹一下解決的步驟吧:
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有效期一般都好幾十年,有點一勞永逸的傾向。(主要還是懶~~~~~~)