iOS 簽名機制

級別: ★★☆☆☆
標籤:「iOS」「Apple」「簽名機制」
做者: 憶思夢
審校: QiShare團隊php


前言補序:本文源於bang's blog的指導,QiShare整理了對iOS簽名機制的知識。在此還要感謝bang神的原做git

由於蘋果的安全策略,經過簽名機制保證手機上的每一個App都是通過蘋果認證的。 App的安裝方式有四種:github

  1. 經過App Store安裝。
  2. 開發者能夠經過Xcode安裝。
  3. Ad-Hoc 測試證書打包的App,數量限制100。
  4. In-House 企業版證書打包App,信任企業證書後可使用。

1、 經過App Store安裝

白板1.png

  1. 由蘋果生成一對公私鑰,公鑰內置與iOS設備中,私鑰由蘋果保管。
  2. 開發者上傳App給蘋果審覈後,蘋果用私鑰對App數據進行簽名,發佈至App Store。
  3. iOS設備下載App後,用公鑰進行驗證,若正確,則證實App是由蘋果認證過的。

2、經過Xcode安裝(真機調試)

因爲不須要提交蘋果審覈,因此蘋果沒辦法對App進行簽名,所以蘋果採用了雙重簽名的機制。Mac電腦有一對公私鑰,蘋果仍是原來的一對公私鑰。安全

Xcode真機調試
(圖文步驟不必定相同)

  1. 開發時須要真機測試時,須要從鑰匙串中的證書中心建立證書請求文件(CSR),並傳至蘋果服務器。
  2. Apple使用私鑰對 CSR 簽名,生成一份包含Mac公鑰信息及Apple對它的簽名,被稱爲證書(CER:即開發證書,發佈證書)。
  3. 編譯完一個App後,Mac電腦使用私鑰對App進行簽名。
  4. 在安裝App時,根據當前配置把CER證書一塊兒打包進App。
  5. iOS設備經過內置的Apple的公鑰驗證CER是否正確,證書驗證確保Mac公鑰時通過蘋果認證的。
  6. 再使用CER文件中Mac的公鑰去驗證App的簽名是否正確,確保安裝行爲是通過蘋果容許的。

蘋果只是肯定這裏的安裝行爲是否合法,不會驗證App內容是否修改。服務器

注: 證書請求文件(CertificateSigningRequest.certSigningRequest),用於綁定電腦,文件中應該有Mac電腦的公鑰。微信

3、經過Ad-Hoc正式打包安裝

Xcode打包App生成ipa文件,經過iTunes或者蒲公英等第三方發佈平臺,安裝到手機上。流程步驟基本和真機調試相同,差異在於第4步:測試

  1. 開發時須要打包測試或發佈時,須要從鑰匙串中的證書中心建立證書請求文件(CSR),並傳至蘋果服務器。
  2. Apple使用私鑰對 CSR 簽名,生成一份包含Mac公鑰信息及Apple對它的簽名,被稱爲證書(CER:即開發證書,發佈證書)。
  3. 編譯完一個App後,Mac電腦使用私鑰對App進行簽名。
  4. 編譯簽名完以後,要導出ipa文件,導出時,須要選擇一個保存的方法(App Store/Ad Hoc/Enterprise/Development),就是選擇將上一步生成的CER一塊兒打包進App。
  5. iOS設備經過內置的Apple的公鑰驗證CER是否正確,證書驗證確保Mac公鑰是通過蘋果認證的。
  6. 再使用CER文件中Mac的公鑰去驗證App的簽名是否正確,確保安裝行爲是通過蘋果容許的。

4、In-House企業版證書打包

企業版證書籤名驗證流程和Ad-Hoc差很少。只是企業版不限制設備數,並且須要用戶在iOS設備上手動點擊信任證書。.net

附加一些東西

經過真機調試安裝和證書打包安裝,不加限制,可能會致使被濫用(不經過App Store,只經過第三方發佈平臺就能安裝),所以蘋果加了兩個限制:在蘋果註冊過的設備才能夠安裝;簽名只針對某一個App。3d

在上述第4步,打包證書進App中時,還須要加上容許安裝的設備ID和App對應的APPID等數據(Profile文件)。調試

根據數字簽名的原理,只要數字簽名經過驗證,第 5 步這裏的設備 IDs / AppID / Mac公鑰 就都是通過蘋果認證的,沒法被修改,蘋果就能夠限制可安裝的設備和App,避免濫用。

蘋果還要控制iCloud/push/後臺運行等,這些都須要蘋果受權簽名,蘋果把這些權限開關統稱爲:Entitlements,去讓蘋果受權。

所以證書中可能包含不少東西,不符合規定的格式規範,因此有了Provisioning Profile(描述文件),描述中包含了證書以及其餘全部的信息及信息的簽名。

四種簽名方式的區別

簽名方式 說明
App Store 用於發佈到App Store。使用的是發佈證書(Cer)。
Ad Hoc 安裝到指定設備上,用於測試。使用的是發佈證書(Cer)。
Enterprise 企業版證書籤名。
Development 安裝到指定設備,用於測試。使用的是開發證書(Cer)。

總結一下最終流程

蘋果簽名完整流程

  1. Mac電腦和蘋果分別有一套公私鑰,蘋果的私鑰在後臺,公鑰存放在每一個iOS設備,Mac的私鑰存放在電腦,公鑰後面要發送給蘋果服務器。
  2. Mac從鑰匙串生成CSR(就是或者包含公鑰),上傳至蘋果服務器。
  3. 蘋果服務器使用私鑰對CSR進行簽名,獲得包含Mac公鑰以及其簽名的數據,稱爲證書(Cer文件)。
  4. 從蘋果後臺申請Appid,配置好設備ID列表及App的其餘權限信息,使用蘋果的私鑰進行簽名生成描述文件(Provisioning Profile),和第 3 步的證書Cer一併下載到Mac安裝,鑰匙串會自動將Cer與以前生成CSR文件的私鑰關聯(公私鑰對應)。
  5. 使用Mac編譯App後,使用Mac私鑰進行簽名,並把 描述文件 打包進App,文件名爲embedded.mobileprovision
  6. 安裝App時,iOS設備取得證書,使用內置的Apple私鑰去驗證Cer及embedded.mobileprovision文件。
  7. 保證Cer及embedded.mobileprovision是通過蘋果認證以後,從Cer中取出Mac公鑰,驗證App簽名,及設備id列表、權限開關是否對應。
  1. 其餘人想要編譯簽名App時應怎麼作? 簡單就是把私鑰給他。私鑰也是從 鑰匙串 中導出,就是.p12文件,其餘Mac導入私鑰後就能夠正常使用了。
  1. 查看ipa包中註冊的設備ID 解壓.ipa文件,獲得App數據包,顯示包內容,找到embedded.mobileprovision文件所在目錄,運行命令security cms -D -i embedded.mobileprovision
名詞概念 說明
證書請求文件(CertificateSigningRequest.certSigningRequest) 本地公鑰。
證書(Cer) 公鑰及蘋果簽名後的信息。
Entitlements 包含了 App 權限開關列表。
p12 本地私鑰,能夠導入到其餘電腦。
Provisioning Profile 包含了 證書 / Entitlements 等數據,並由蘋果後臺私鑰簽名的數據包。

參考文章:

  1. iOS App 簽名的原理
  2. bang's blog

關注咱們的途徑有:
QiShare(簡書)
QiShare(掘金)
QiShare(知乎)
QiShare(GitHub)
QiShare(CocoaChina)
QiShare(StackOverflow)
QiShare(微信公衆號)

推薦文章:
iOS 掃描二維碼/條形碼
iOS 瞭解Xcode Bitcode
iOS 重繪之drawRect
iOS 編寫高質量Objective-C代碼(八)
奇舞週刊

相關文章
相關標籤/搜索