iOS證書大全

一. 前言

iOS各類證書一直很復(fù)雜,即使擁有多年開發(fā)經(jīng)驗(yàn)的開發(fā)者,還是會(huì)搞混淆。本文從全方面來(lái)剖析iOS證書機(jī)制。

二.iOS 簽名機(jī)制

我們先來(lái)了解一下 ipa 包的簽名機(jī)制
image.png

開發(fā)者 Mac 系統(tǒng)中生成一對(duì)非對(duì)稱加密算法的公私鑰 M,將公鑰和開發(fā)者信息生成 CSR 文件給到蘋果服務(wù)器 蘋果有自己的公私鑰 K,其中公鑰 K 存在每一臺(tái)的 iPhone 設(shè)備上,私鑰 K 則保存在蘋果服務(wù)器。根據(jù) CSR 內(nèi)容利用私鑰 K 進(jìn)行簽名并生成證書,同時(shí)也根據(jù)在開發(fā)者后臺(tái)填寫的信息(Bundle ID,權(quán)限等)和證書生成描述文件(mobileprovision) 在開發(fā)者設(shè)備上打包時(shí),會(huì)把描述文件一并打包到 ipa 中,并利用私鑰 M 對(duì)包的內(nèi)容進(jìn)行簽名 在安裝到設(shè)備上時(shí),會(huì)進(jìn)行兩次驗(yàn)證:利用設(shè)備上的公鑰 K 校驗(yàn) ipa 包內(nèi)的證書文件(證書是通過(guò)蘋果私鑰 K 簽名),校驗(yàn)證書是否有效 上一步證書校驗(yàn)通過(guò)后,會(huì)拿出證書內(nèi)的公鑰 M 來(lái)校驗(yàn) ipa 包(ipa 包是通過(guò)開發(fā)者私鑰 M簽名),校驗(yàn) ipa 包是否可安裝

蘋果通過(guò)以上的雙重驗(yàn)證機(jī)制,來(lái)確保在開發(fā)階段 App 的安裝行為的合法性。當(dāng)將 App 提交到 App Store 后,蘋果會(huì)對(duì) App 重新加密簽名,安裝時(shí)就只需驗(yàn)證蘋果的簽名。
推薦一個(gè)重簽名工具:iOS-App-Signer

三.各種證書詳解

1.開發(fā)者賬號(hào)

個(gè)人:99 美元/年,不需要鄧白氏碼,可上線AppStore
公司:99 美元/年,需要鄧白氏碼,可上線AppStore,允許團(tuán)隊(duì)協(xié)作
企業(yè):299 美元/年,需要鄧白氏碼,不可上線AppStore,允許團(tuán)隊(duì)協(xié)作

2.iOS證書

iOS證書是用來(lái)證明iOS App內(nèi)容(executable code)的合法性和完整性的數(shù)字證書。對(duì)于想安裝到真機(jī)或發(fā)布到AppStore的應(yīng)用程序(App),只有經(jīng)過(guò)簽名驗(yàn)證(Signature Validated)才能確保來(lái)源可信,并且保證App內(nèi)容是完整、未經(jīng)篡改的

  • 開發(fā)證書:Development證書用來(lái)開發(fā)和調(diào)試應(yīng)用程序
  • 發(fā)布證書:Production主要用來(lái)分發(fā)應(yīng)用程序

普通個(gè)人開發(fā)賬號(hào)最多可注冊(cè)iOS Development/Distribution證書各2個(gè),用戶可在網(wǎng)站上刪除(Revoke)已注冊(cè)的Certificate

3.App ID和設(shè)備

  • 較為簡(jiǎn)單,此處略過(guò)

4.CSR描述文件

  • 通過(guò)Keychain證書助理從證書頒發(fā)機(jī)構(gòu)請(qǐng)求證書
  • Keychain將生成一個(gè)包含開發(fā)者身份信息的CSR(Certificate Signing Request)文件
  • Private Key始終保存在Mac OS的Keychain Access中,用于簽名(CodeSign)對(duì)外發(fā)布的App
  • Public Key一般隨證書(隨Provisioning Profile,隨App)散布出去,對(duì)App簽名進(jìn)行校驗(yàn)認(rèn)證。用戶必須保護(hù)好本地Keychain中的private key,以防偽冒
  • Apple證書頒發(fā)機(jī)構(gòu)WWDRCA(Apple Worldwide Developer Relations Certification Authority)將使用Private Key對(duì)CSR中的public key和一些身份信息進(jìn)行加密簽名生成數(shù)字證書(ios_development.cer)并記錄在案(Apple Member Center)

從Apple Member Center網(wǎng)站下載證書到Mac上雙擊即可安裝(當(dāng)然也可在Xcode中添加開發(fā)賬號(hào)自動(dòng)同步證書和[生成]配置文件)。證書安裝成功后,在KeychainAccess|登錄|密鑰 中展開創(chuàng)建CSR時(shí)生成的Key Pair中的私鑰前面的箭頭,可以查看到包含其對(duì)應(yīng)公鑰的證書(Your requested certificate will be the public half of the key pair.);在Keychain Access|登錄|證書 中展開安裝的證書(ios_development.cer)前面的箭頭,可以看到其對(duì)應(yīng)的私鑰。

image.png

image.png

4.配置文件Provisioning Profile

  • Provisioning Profile文件包含了上述的所有內(nèi)容: 證書、App ID和設(shè)備。


    image.png

    一個(gè)Provisioning Profile對(duì)應(yīng)一個(gè)Explicit App ID或Wildcard App ID(一組相同Prefix/Seed的App IDs)。在網(wǎng)站上手動(dòng)創(chuàng)建一個(gè)Provisioning Profile時(shí),需要依次指定App ID(單選)、證書(Certificates,可多選)和設(shè)備(Devices,可多選)。用戶可在網(wǎng)站上刪除(Delete)已注冊(cè)的Provisioning Profiles。
    Provisioning Profile決定Xcode用哪個(gè)證書(公鑰)/私鑰組合(Key Pair/Signing Identity)來(lái)簽署應(yīng)用程序(Signing Product),將在應(yīng)用程序打包時(shí)嵌入到.ipa包里。安裝應(yīng)用程序時(shí),Provisioning Profile文件被拷貝到iOS設(shè)備中,運(yùn)行該iOS App的設(shè)備也通過(guò)它來(lái)認(rèn)證安裝的程序。
    如果要打包或者在真機(jī)上運(yùn)行一個(gè)APP,一般要經(jīng)歷以下三步:

  • 首先,需要指明它的App ID,并且驗(yàn)證Bundle ID是否與其一致;
  • 其次,需要證書對(duì)應(yīng)的私鑰來(lái)進(jìn)行簽名,用于標(biāo)識(shí)這個(gè)APP是合法、安全、完整的;
  • 然后,如果是真機(jī)調(diào)試,需要確認(rèn)這臺(tái)設(shè)備是否授權(quán)運(yùn)行該APP。

5.團(tuán)隊(duì)配置文件Team Provisioning Profile

  • 概念:每個(gè)Apple開發(fā)者賬號(hào)都對(duì)應(yīng)一個(gè)唯一的 Team ID,Xcode早期發(fā)布版本中加入了Team Provisioning Profile這項(xiàng)新功能。
  • 在Xcode中添加Apple Developer Account時(shí),它將與Apple Member Center后臺(tái)勾兌 自動(dòng)生成iOS Team Provisioning Profile(Managed by Xcode)。


    image.png

    image.png

Team Provisioning Profile包含一個(gè)為Xcode iOS Wildcard App ID()生成的iOS Team Provisioning Profile:(匹配所有應(yīng)用程序),賬戶里所有的Development Certificates和Devices都可以使用它在這個(gè)team注冊(cè)的所有設(shè)備上調(diào)試所有的應(yīng)用程序(不管bundle identifier是什么)。同時(shí),它還會(huì)為開發(fā)者自己創(chuàng)建的Wildcard/Explicit App IDs創(chuàng)建對(duì)應(yīng)的iOS Team Provisioning Profile。

  • Team Provisioning Profile生成/更新時(shí)機(jī)
    • Add an Apple ID account to Xcode
    • Fix issue "No Provisioning Profiles with a valid signing identity" in Xcode
    • Assign Your App to a Team in Xcode project settings of General|Identity
    • Register new device on the apple development website or Xcode detected new device connected
  • 利用Xcode生成和管理的iOS Team Provisioning Profile來(lái)進(jìn)行開發(fā)非常方便,可以不需要上網(wǎng)站手動(dòng)生成下載Provisioning Profile。
    Team Provisioning Profile同Provisioning Profile,只不過(guò)是由Xcode自動(dòng)生成的,也被配置到【XcodeTarget|Build Settings|Code Signing|Provisioning Profile】下。

6.證書與簽名

  • Code Signing Identity
    image.png

    image.png

    Xcode中配置的Code Signing Identity(entitlements、certificate)必須與Provisioning Profile匹配,并且配置的Certificate必須在本機(jī)Keychain Access中存在對(duì)應(yīng)Public/Private Key Pair,否則編譯會(huì)報(bào)錯(cuò)。
    Xcode所在的Mac設(shè)備(系統(tǒng))使用CA證書(WWDRCA.cer)來(lái)判斷Code Signing Identity中Certificate的合法性:
  • 若用WWDRCA公鑰能成功解密出證書并得到公鑰(Public Key)和內(nèi)容摘要(Signature),證明此證書確乃AppleWWDRCA發(fā)布,即證書來(lái)源可信;
  • 再對(duì)證書本身使用哈希算法計(jì)算摘要,若與上一步得到的摘要一致,則證明此證書未被篡改過(guò),即證書完整。
  • Code Signing
    每個(gè)證書(其實(shí)是公鑰)對(duì)應(yīng)Key Pair中的私鑰會(huì)被用來(lái)對(duì)內(nèi)容進(jìn)行數(shù)字簽名(CodeSign)——使用哈希算法生成內(nèi)容摘要(digest)。
    Xcode使用指定證書配套的私鑰進(jìn)行簽名時(shí)需要授權(quán),選擇【始終允許】后,以后使用該私鑰進(jìn)行簽名便不會(huì)再?gòu)棾鍪跈?quán)確認(rèn)窗口。
    image.png
  • Verify Code Signature with Certificate
    上面已經(jīng)提到,公鑰被包含在數(shù)字證書里,數(shù)字證書又被包含在描述文件(Provisioning File)中,描述文件在應(yīng)用被安裝的時(shí)候會(huì)被拷貝到iOS設(shè)備中。
    第一步,App在Mac/iOS真機(jī)上啟動(dòng)時(shí),需要對(duì)配置的bundle ID、entitlements和certificate與Provisioning Profile進(jìn)行匹配校驗(yàn):
    image.png

    第二步,iOS/Mac真機(jī)上的ios_development.cer被AppleWWDRCA.cer中的 public key解密校驗(yàn)合法后,獲取每個(gè)開發(fā)證書中可信任的公鑰對(duì)App的可靠性和完整性進(jìn)行校驗(yàn)。
    iOS/Mac設(shè)備(系統(tǒng))使用App Provisioning Profile(Code Signing Identity)中的開發(fā)證書來(lái)判斷App的合法性:
  • 若用證書公鑰能成功解密出App(executable code)的內(nèi)容摘要(Signature),證明此App確乃認(rèn)證開發(fā)者發(fā)布,即來(lái)源可信;
  • 再對(duì)App(executable code)本身使用哈希算法計(jì)算摘要,若與上一步得到的摘要一致,則證明此App(executable code)未被篡改過(guò),即內(nèi)容完整。
  • 小結(jié):
    • 基于Provisioning Profile校驗(yàn)了CodeSign的一致性;
    • 基于Certificate校驗(yàn)App的可靠性和完整性;
    • 啟動(dòng)時(shí),真機(jī)的device ID(UUID)必須在Provisioning Profile的ProvisionedDevices授權(quán)之列。

7.在多臺(tái)機(jī)器上共享開發(fā)賬戶/證書

image.png
  • 1.Xcode導(dǎo)出開發(fā)者賬號(hào)(*.developerprofile)和 PKCS12文件(*.p12)
    • 進(jìn)入Xcode Preferences|Accounts:
    • 選中Apple IDs列表中對(duì)應(yīng)Account的的Email,點(diǎn)擊+-之后的?|Export Apple ID And Code Signing Assets...,可導(dǎo)出包含account/code signing identity/provisioning profiles信息的*.developerprofile(Exporting a Developer Profile)文件供其他機(jī)器上的Xcode開發(fā)使用(Import該developerprofile)。
  • 2.Keychain Access導(dǎo)出PKCS12文件(*.p12)
    • 在Keychain Access|Certificates中選中欲導(dǎo)出的certificate或其下private key,右鍵Export或者通過(guò)菜單File|Export Items導(dǎo)出Certificates.p12——PKCS12 file holds the private key and certificate。
  • 其他Mac機(jī)器上雙擊Certificates.p12(如有密碼需輸入密碼)即可安裝該共享證書。有了共享證書之后,在開發(fā)者網(wǎng)站上將欲調(diào)試的iOS設(shè)備注冊(cè)到該開發(fā)者賬號(hào)名下,并下載對(duì)應(yīng)證書授權(quán)了iOS調(diào)試設(shè)備的Provisioning Profile文件,方可在iOS真機(jī)設(shè)備上開發(fā)調(diào)試。

8.其他

  • 云管理式證書
    • 一種新的管理證書方式,比較牛逼
    • 簡(jiǎn)述:在更新xcode13后,蘋果上線了一種新的證書——云管理式證書,包括Distribution Managed和Development Managed。在打包或真機(jī)運(yùn)行的時(shí)候可以使用云管理式證書對(duì)其應(yīng)用進(jìn)行簽名,而且這種證書可以自動(dòng)發(fā)起輪換,即不需要關(guān)心他的過(guò)期時(shí)間。同時(shí),既然叫云管理證書,那也就不需要下載到本地鑰匙串了。整個(gè)簽名過(guò)程在蘋果服務(wù)器線上完成。
      蘋果的這個(gè)功能大大簡(jiǎn)化了開發(fā)的步驟,過(guò)去在開發(fā)之前,需要配置和導(dǎo)入一系列證書。而現(xiàn)在在一臺(tái)新電腦上進(jìn)行開發(fā)和打包,只需要登錄對(duì)應(yīng)的Apple ID就可以直接編譯運(yùn)行和打包了,其他事情不需要開發(fā)者關(guān)心。
    • 詳情參考鏈接
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容