iOS 簽名機制

QiShare發表於2018-12-20

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


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

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

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

一、 通過App Store安裝

白板1.png

  1. 由蘋果生成一對公私鑰,公鑰內建與iOS裝置中,私鑰由蘋果保管。
  2. 開發者上傳App給蘋果稽核後,蘋果用私鑰對App資料進行簽名,釋出至App Store。
  3. iOS裝置下載App後,用公鑰進行驗證,若正確,則證明App是由蘋果認證過的。

二、通過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電腦的公鑰。

三、通過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的簽名是否正確,確保安裝行為是經過蘋果允許的。

四、In-House企業版證照打包

企業版證照籤名驗證流程和Ad-Hoc差不多。只是企業版不限制裝置數,而且需要使用者在iOS裝置上手動點選信任證照。

附加一些東西

通過真機除錯安裝和證照打包安裝,不加限制,可能會導致被濫用(不通過App Store,只通過第三方釋出平臺就能安裝),因此蘋果加了兩個限制:在蘋果註冊過的裝置才可以安裝;簽名只針對某一個App。

在上述第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程式碼(八)
奇舞週刊

相關文章