iOS攻防-序章(2)-簽名機制

前言:對於一個iOS開發入門來說,一定會被一堆諸如:csr文件、私鑰、Provisioning Profile、p12等名詞搞的一頭霧水。當年我也如此,但相信我,iOS的簽名機制其實並不複雜,而瞭解這套機制對於iOS攻防的研究有很大幫助

何爲簽名

假設A和B進行通訊,A向B發送了一個訊息,B收到後,會有一個問題?如何證明這個信息來自於A?

瞭解過非對稱加密算法的同學應該不難想出解決方法,利用非對稱加密算法的特性:私鑰加密內容,只有公鑰能解密。只要保證私鑰不泄露,把公鑰發給需要通訊的對象。利用私鑰加密數據,而收到數據的人利用公鑰去解密,如果能解出正常的內容,那就證明這段訊息是來自對方。

實際上,網絡上普遍使用的數字簽名技術,就是基於這樣的機制實現的:

圖片來自於網絡:

sign0

簽名機制根本上要解決兩個問題:

  1. 你正在安裝的應用來自蘋果授權
  2. 你正在安裝的應用確實是你的應用

基於這兩個問題,蘋果搞出了一套雙簽名機制。首先,真對第一個問題,怎麼證明應用是經過蘋果授權的?這就牽扯出了第二個概念:證書

何爲證書

每個iOS開發人員都會接觸過發佈證書,這東西到底幹嘛的?

  1. 首先,在每一臺 Mac 開發機器上,會生成一對公私鑰,這裏稱爲公鑰Local私鑰Local
  2. 蘋果自己有固定的一對公私鑰,私鑰在蘋果後臺,公鑰在每個 iOS 設備上。這裏稱爲公鑰Apple私鑰Apple。把公鑰Local 傳到蘋果後臺,用蘋果後臺裏的私鑰Apple 去簽名公鑰Local。得到一份數據包含了公鑰Local以及其簽名,把這份數據稱爲證書。

還記得我們在發佈應用之前,去開發者網站生成發佈證書的過程嘛?

每次在申請發佈證書時,都會在鑰匙串工具裏導出一份csr文件(CertificateSigningRequest.certSigningRequest)傳到蘋果開發者網站上。而這個文件其實就是公鑰Local,生成證書請求文件的過程就對應了之前提到的步驟1。

接下來,經過步驟2,我們就得到了發佈證書(其中包括了公鑰Local簽名Apple)。下載發佈證書,安裝到鑰匙串中。你會發現你的證書和一個私鑰進行了映射(這個私鑰就是私鑰Local,共私鑰對應


 

何爲Provisioning Profile

仔細回想下接下來的流程:把證書安裝到Mac後,回到蘋果開發者網站,要去獲取生產配置文件(Provisioning Profile 又是個老面孔)。生產配置文件除了包含剛纔生成的證書,還有允許安裝的設備列表(develop、adhoc、distribution的區別)、app id,以及Entitlements(這個大家應該也不陌生,你的App支持的權限:比如推送、內購、game center等)。

簽名和驗證機制

有了 證書 和 生產配置文件,我們才能打包上架App。在開發時,編譯完一個 App 後,用本地的私鑰Local 對這個 App 進行簽名(簽名Local),同時把 Provisioning Profile 文件打包進 APP 裏,命名爲 embedded.mobileprovision。

接下來是重頭戲:應用在在安裝時,iOS 系統取得證書,通過系統內置的公鑰Apple,去驗證 embedded.mobileprovision 的數字簽名Apple是否正確。注意剛纔的流程,embedded.mobileprovision裏有我們從蘋果獲得的發佈證書,由於發佈證書是用私鑰Apple簽名的,還記得我們第一段講述的,數字簽名的機制嘛?這個流程能夠驗證剛纔提到的第一個問題:你正在安裝的應用來自蘋果授權

第一步驗證完成之後,就能獲取到證書內應用發佈者的公鑰Local,在應用打包時,我們會用私鑰Local進行簽名(簽名Local),第二部驗證:用公鑰Local去驗證簽名Local,從而解決剛纔提到的第二個問題:你正在安裝的應用確實是你的應用。

其實,後面還會驗證設備列表、權限開關等,這裏就不展開講了。

最後用一張圖來描述下整體流程:

sign3

 

這裏有個題外話:

p12到底是什麼?

有很多開發人員會有這樣的經歷:即使從開發者網站上下載了發佈證書一樣無法發佈應用。而是需要從生成發佈證書的電腦上導出私鑰:即p12文件。瞭解了整個簽名機制應該就能明白,由於下載的證書會和生成證書的私鑰建立對應關係,如果沒有這個私鑰,即使有證書,也無法在最後打包應用時,用私鑰Local進行簽名。而p12,就是可以導入到其他電腦的私鑰Loacal。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章