一. 前言
iOS各類證書一直很復(fù)雜毫目,即使擁有多年開發(fā)經(jīng)驗(yàn)的開發(fā)者,還是會(huì)搞混淆牵现。本文從全方面來(lái)剖析iOS證書機(jī)制修陡。
二.iOS 簽名機(jī)制
我們先來(lái)了解一下 ipa 包的簽名機(jī)制開發(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)的私鑰喷面。
4.配置文件Provisioning Profile
-
Provisioning Profile文件包含了上述的所有內(nèi)容: 證書咬像、App ID和設(shè)備陷舅。
一個(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)。
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
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)窗口。
-
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):
第二步矮男,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ā)賬戶/證書
- 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)心蜕提。 - 詳情參考鏈接