iOS應⽤簽名原理淺析

Daniel_Coder發表於2020-10-10

1. 前文

還記得剛開始開發iOS APP的時候,總是在真機除錯這塊弄的雲裡霧裡的,什麼證書,什麼描述檔案,bundle id什麼的,測試裝置沒有新增到證書裡面,等等一系列問題,不知道現在剛入門的朋友們還有沒有這樣的問題。

今天這篇文章就簡單介紹一些iOS應用的簽名原理,希望能幫到那些入門的朋友,針對資深的朋友,希望也能起到一定的幫助,如果有不對的地方,還希望路過的朋友多多指正。

2. 數字簽名

在進入正題之前,我們先看看數字簽名。

比如開發者向伺服器上傳了一段程式碼,即可執行檔案,那麼伺服器將可執行檔案做雜湊運算,得到一個雜湊值,然後再用伺服器的私鑰對雜湊值進行加密(簽名)。當客戶端下載了這個可執行檔案後,客戶端首先將可執行檔案做雜湊運算,得到一個雜湊值,然後用客戶端的公鑰對伺服器端的簽名解密,最後將解密後得到的雜湊值與客戶端自己算出來的雜湊值進行比較,從而驗證整個上傳下載過程中,檔案是否被修改等問題。

3. 簡單程式碼簽名

程式碼簽名是對可執⾏⽂件或指令碼進⾏數字簽名。⽤來確認軟體的簽名未被修改或損壞的措施,和數字簽名原理⼀樣,只不過簽名的資料是程式碼⽽已。

那麼蘋果是如何做到確保每一個安裝到iOS系統上的APP都是經過蘋果官方允許的呢?這裡就要用到程式碼簽名

最簡單的程式碼簽名就是通過蘋果官⽅⽣成⾮對稱加密的⼀對公私鑰,在iOS的系統中內建⼀個公鑰,而私鑰由蘋果後臺儲存,我們的APP上傳到AppStore時,蘋果後臺⽤私鑰對APP資料進⾏簽名,iOS裝置下載這個APP後,⽤公鑰驗證這個簽名,若簽名正確,則說明這個APP肯定是由蘋果後臺認證的,並且沒有被修改過,保證安裝的每⼀個APP都是經過蘋果官⽅允許的。

這種方法確實很簡單,但是並不是所有的APP都需要經過App Store這一步驟的,比如開發者真機除錯,企業級的APP安裝,這些是不需要上傳到App Store的,那麼也就不會在App Store後臺通過私鑰簽名。
所以實際的簽名並不是這麼簡單的,請繼續往下看。

4. 雙層程式碼簽名

上面提到簡單的程式碼簽名是不能保證蘋果對安裝到iOS系統的APP的絕對控制權,那麼既要保證絕對的控制權,又要保證系統的安全性,則需要雙層程式碼簽名
先看看示意圖:
在這裡插入圖片描述
下面針對這個示意圖簡單說明一下:
在整個過程中,有三個主要的角色,我們的Mac電腦,iOS裝置,蘋果伺服器。

  1. 通過Mac電腦的鑰匙串(Keychain)生成一個請求請求證書所需要的XXX.certSigningRequest檔案,簡稱CSR(Certificate Signing Request,將這個檔案儲存到本地,留作後用,再建立完這個檔案的同時,鑰匙串(Keychain)裡也生成了一對非對稱加密的公鑰和私鑰,我們簡稱為公鑰M和私鑰M。
  2. 蘋果還有一對加密的公鑰和私鑰,其中公鑰(簡稱公鑰A)儲存在iOS裝置裡,私鑰(簡稱私鑰A)儲存在蘋果伺服器。
  3. 當去開發者中心申請證書的時候,需要將之前建立的CSR檔案傳給蘋果伺服器,這個CSR檔案則包含了公鑰M和一些開發者的資訊。蘋果伺服器則用私鑰A對傳來的公鑰M進行簽名,將簽名結果和雜湊值放到證書裡面。當然了,得到證書不是我們的目的,我們最終是要得到一個叫描述檔案(Provisioning Profile)的東西,這個東西里面則包含了剛剛建立的證書,AppID,裝置IDs以及一些許可權檔案等。
  4. 在開發時,編譯完⼀個 APP後,⽤本地的私鑰 M(匯出的P12)對這個 APP進⾏簽名,同時把第三步得到的描述檔案⼀起打包進 APP⾥,安裝到⼿機上。
  5. 在安裝時,先要判斷當前裝置是否包含在描述檔案裡面,如果包含,iOS系統取得描述檔案中的證書,通過系統內建的公鑰 A,去驗證證書的數字簽名是否正確。
  6. 驗證通過後確保了公鑰 M是蘋果認證過的,再⽤公鑰 M去驗證 APP 的簽名(第4步的簽名),這⾥就驗證了這個 APP安裝⾏為是否經過蘋果官⽅允許。

以上示意圖及說明只是對蘋果雙層程式碼簽名的一個梳理,蘋果實際簽名應該會比這更復雜一些。

5. 描述檔案

上面已經設計到描述檔案了,那描述檔案具體有什麼資訊,又有什麼用呢?請看下面這個圖:
在這裡插入圖片描述
瞭解完描述檔案主要內容後,再看看為什麼要有這個東西。通過雙層驗證,可以確保安裝到iOS裝置上的APP是蘋果認可的,但是蘋果會允許開發者通過一個電腦給很多很多的裝置安裝APP嗎?當然不會了。蘋果為了解決這個問題,⼜加了兩個限制:
第⼀限制在蘋果後臺註冊過的裝置才可以安裝。
第⼆限制簽名只能針對某⼀個具體的APP。
並且蘋果還想控制App⾥⾯的iCloud/PUSH/後臺運⾏/偵錯程式附加這些許可權,所以蘋果把這些許可權開關統⼀稱為Entitlements(授權⽂件),並將這個⽂件放在了⼀個叫做Provisioning Profile(描述⽂件)⽂件中。

描述⽂件是在AppleDeveloper⽹站建立的,Xcode運⾏時會打包進⼊APP內.
所以我們使⽤CSR申請證書時,我們還要申請⼀個東⻄,那就是描述⽂件。

6. 結束語

本篇文章主要分析了一下iOS應⽤簽名原理,希望能對各位同仁有所幫助。

由於重點在簽名原理,所以文章中未涉及如何建立CSR檔案,如何申請證書,建立描述檔案,如果有必要,後續文章會記錄這些。

最後,走過路過的朋友,如果覺得文章對您有所幫助,不要不捨得您的贊哦,如果文章有需要更正的地方,還請指出,謝謝!

相關文章