iOS 簽名機制

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


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

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

  1. 通過App Store安裝。
  2. 開發(fā)者可以通過Xcode安裝。
  3. Ad-Hoc 測試證書打包的App,數(shù)量限制100。
  4. In-House 企業(yè)版證書打包App,信任企業(yè)證書后可以使用。

一、 通過App Store安裝

通過App Store安裝
  1. 由蘋果生成一對公私鑰,公鑰內置與iOS設備中,私鑰由蘋果保管。
  2. 開發(fā)者上傳App給蘋果審核后,蘋果用私鑰對App數(shù)據(jù)進行簽名,發(fā)布至App Store。
  3. iOS設備下載App后,用公鑰進行驗證,若正確,則證明App是由蘋果認證過的。

二、通過Xcode安裝(真機調試)

由于不需要提交蘋果審核,所以蘋果沒辦法對App進行簽名,因此蘋果采用了雙重簽名的機制。Mac電腦有一對公私鑰,蘋果還是原來的一對公私鑰。

Xcode真機調試

(圖文步驟不一定相同)

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

蘋果只是確定這里的安裝行為是否合法,不會驗證App內容是否修改。

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

三、通過Ad-Hoc正式打包安裝

Xcode打包App生成ipa文件,通過iTunes或者蒲公英等第三方發(fā)布平臺,安裝到手機上。流程步驟基本和真機調試相同,差別在于第4步:

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

四、In-House企業(yè)版證書打包

企業(yè)版證書簽名驗證流程和Ad-Hoc差不多。只是企業(yè)版不限制設備數(shù),而且需要用戶在iOS設備上手動點擊信任證書。

附加一些東西

通過真機調試安裝和證書打包安裝,不加限制,可能會導致被濫用(不通過App Store,只通過第三方發(fā)布平臺就能安裝),因此蘋果加了兩個限制:在蘋果注冊過的設備才可以安裝;簽名只針對某一個App。

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

根據(jù)數(shù)字簽名的原理,只要數(shù)字簽名通過驗證,第 5 步這里的設備 IDs / AppID / Mac公鑰 就都是經(jīng)過蘋果認證的,無法被修改,蘋果就可以限制可安裝的設備和App,避免濫用。

蘋果還要控制iCloud/push/后臺運行等,這些都需要蘋果授權簽名,蘋果把這些權限開關統(tǒng)稱為:Entitlements,去讓蘋果授權。

因此證書中可能包含很多東西,不符合規(guī)定的格式規(guī)范,所以有了Provisioning Profile(描述文件),描述中包含了證書以及其他所有的信息及信息的簽名。

四種簽名方式的區(qū)別

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

總結一下最終流程

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

參考文章:
iOS App 簽名的原理
bang's blog


了解更多iOS及相關新技術,請關注我們的公眾號:

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

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 簽名目的 先來看看蘋果采用簽名機制的目的。在iOS出來之前,在主流操作系統(tǒng)(Mac/Windows/Linux)上...
    ireliaBR閱讀 1,204評論 1 3
  • iOS簽名的目的 在 iOS 出來之前,在主流操作系統(tǒng)(Mac/Windows/Linux)上開發(fā)和運行軟件是不需...
    9c58c26cf67d閱讀 1,727評論 0 4
  • 私自安裝的程序為何不能運行?XX 助手下載的應用為何頻頻閃退?codesign failed 究竟是何人所為?mi...
    gbupup閱讀 855評論 0 8
  • 構建jekyll 注意:不要使用ubuntu的apt-get命令安裝ruby,版本較舊,安裝不了jekyll 構建...
    予早閱讀 303評論 0 0
  • 通常早晨五點你在干什么?睡覺?讀書?鍛煉?還是在床上糾結要不要早起? 每個人一天都只有24個小時,但每個人的進步卻...
    阿爾法祥閱讀 1,073評論 5 12

友情鏈接更多精彩內容