iOS各類證書一直很復雜,即使擁有多年開發經驗的開發者紙飛機@cheng716051,還是會搞混淆。
博主今天從全方面來剖析iOS證書機制。
一. 前言
我們都知道開發一款應用需要配置蘋果常用證書、AppId,Provisioning Profiles,如果有推送還需要配置推送證書等,所以索性將所有的證書的配置流程都記錄下來,方便以後查閱。
App ID《bundle identifier》
App ID即Product ID,用於標識一個或者一組App。
App ID應該和Xcode中的Bundle Identifier是一致《Explicit》的或匹配《Wildcard》的。
App ID字符串通常以反域名《reverse-domain-name》格式的Company Identifier《Company ID》作為前綴《Prefix/Seed》,一般不超過255個ASCII字符。
App ID全名會被追加Application Identifier Prefix《一般為TeamID.》,分為兩類:
Explicit App ID:唯一的App ID,用於唯一標識一個應用程序。
例如『com.apple.garageband』這個App ID,用於標識Bundle Identifier為『com.apple.garageband』的App。
Wildcard App ID:含有通配符的App ID,用於標識一組應用程序。
例如『*』《實際上是Application Identifier Prefix》表示所有應用程序;而『com.apple.*』可以表示Bundle Identifier以『com.apple.』開頭《蘋果公司》的所有應用程序。
用戶可在Developer MemberCenter網站上註冊《Register》或刪除《Delete》已註冊的App IDs。
App ID被配置到【XcodeTarget|Info|Bundle Identifier】下;對於Wildcard App ID,只要bundle identifier包含其作為Prefix/Seed即可。
二.iOS 簽名機制
我們先來了解一下 ipa 包的簽名機制
開發者 Mac 系統中生成一對非對稱加密算法的公私鑰 M,將公鑰和開發者信息生成 CSR 文件給到蘋果服務器 蘋果有自己的公私鑰 K,其中公鑰 K 存在每一臺的 iPhone 設備上,私鑰 K 則保存在蘋果服務器。
根據 CSR 內容利用私鑰 K 進行簽名並生成證書,同時也根據在開發者後臺填寫的信息《Bundle ID,權限等》和證書生成描述文件《mobileprovision》 在開發者設備上打包時,會把描述文件一並打包到 ipa 中,並利用私鑰 M 對包的內容進行簽名 在安裝到設備上時,會進行兩次驗證:利用設備上的公鑰 K 校驗 ipa 包內的證書文件《證書是通過蘋果私鑰 K 簽名》,校驗證書是否有效 上一步證書校驗通過後,會拿出證書內的公鑰 M 來校驗 ipa 包《ipa 包是通過開發者私鑰 M簽名》,校驗 ipa 包是否可安裝
蘋果通過以上的雙重驗證機制,來確保在開發階段 App 的安裝行為的合法性。
當將 App 提交到 App Store 後,蘋果會對 App 重新加密簽名,安裝時就隻需驗證蘋果的簽名。
推薦一個重簽名工具:iOS-App-Signer
三.各種證書詳解
1.開發者賬號
個人:99 美元/年,不需要鄧白氏碼,可上線AppStore
公司:99 美元/年,需要鄧白氏碼,可上線AppStore,允許團隊協作
企業:299 美元/年,需要鄧白氏碼,不可上線AppStore,允許團隊協作
2.iOS證書
iOS證書是用來證明iOS App內容《executable code》的合法性和完整性的數字證書。
對於想安裝到真機或發佈到AppStore的應用程序《App》,隻有經過簽名驗證《Signature Validated》才能確保來源可信,並且保證App內容是完整、未經篡改的
開發證書:Development證書用來開發和調試應用程序發佈證書:Production主要用來分發應用程序
普通個人開發賬號最多可註冊iOS Development/Distribution證書各2個,用戶可在網站上刪除《Revoke》已註冊的Certificate
3.App ID和設備
較為簡單,此處略過
4.CSR描述文件
通過Keychain證書助理從證書頒發機構請求證書Keychain將生成一個包含開發者身份信息的CSR《Certificate Signing Request》文件Private Key始終保存在Mac OS的Keychain Access中,用於簽名《CodeSign》對外發佈的AppPublic Key一般隨證書《隨Provisioning Profile,隨App》散佈出去,對App簽名進行校驗認證。
用戶必須保護好本地Keychain中的private key,以防偽冒Apple證書頒發機構WWDRCA(Apple Worldwide Developer Relations Certification Authority)將使用Private Key對CSR中的public key和一些身份信息進行加密簽名生成數字證書《ios_development.cer》並記錄在案《Apple Member Center》
從Apple Member Center網站下載證書到Mac上雙擊即可安裝《當然也可在Xcode中添加開發賬號自動同步證書和[生成]配置文件》。
證書安裝成功後,在KeychainAccess|登錄|密鑰 中展開創建CSR時生成的Key Pair中的私鑰前面的箭頭,可以查看到包含其對應公鑰的證書《Your requested certificate will be the public half of the key pair.》;在Keychain Access|登錄|證書 中展開安裝的證書《ios_development.cer》前面的箭頭,可以看到其對應的私鑰。
蘋果證書申請2023年
蘋果證書申請2023年
4.配置文件Provisioning Profile
Provisioning Profile文件包含了上述的所有內容: 證書、App ID和設備。
一個Provisioning Profile對應一個Explicit App ID或Wildcard App ID《一組相同Prefix/Seed的App IDs》。
在網站上手動創建一個Provisioning Profile時,需要依次指定App ID《單選》、證書《Certificates,可多選》和設備《Devices,可多選》。
用戶可在網站上刪除《Delete》已註冊的Provisioning Profiles。
Provisioning Profile決定Xcode用哪個證書《公鑰》/私鑰組合《Key Pair/Signing Identity》來簽署應用程序《Signing Product》,將在應用程序打包時嵌入到.ipa包裡。
安裝應用程序時,Provisioning Profile文件被拷貝到iOS設備中,運行該iOS App的設備也通過它來認證安裝的程序。
如果要打包或者在真機上運行一個APP,一般要經歷以下三步:首先,需要指明它的App ID,並且驗證Bundle ID是否與其一致;其次,需要證書對應的私鑰來進行簽名,用於標識這個APP是合法、安全、完整的;然後,如果是真機調試,需要確認這臺設備是否授權運行該APP。
5.團隊配置文件Team Provisioning Profile
概念:每個Apple開發者賬號都對應一個唯一的 Team ID,Xcode早期發佈版本中加入了Team Provisioning Profile這項新功能。
在Xcode中添加Apple Developer Account時,它將與Apple Member Center後臺勾兌 自動生成iOS Team Provisioning Profile《Managed by Xcode》。
Team Provisioning Profile包含一個為Xcode iOS Wildcard App ID()生成的iOS Team Provisioning Profile:《匹配所有應用程序》,賬戶裡所有的Development Certificates和Devices都可以使用它在這個team註冊的所有設備上調試所有的應用程序《不管bundle identifier是什麼》。
同時,它還會為開發者自己創建的Wildcard/Explicit App IDs創建對應的iOS Team Provisioning Profile。
Team Provisioning Profile生成/更新時機Add an Apple ID account to XcodeFix issue “No Provisioning Profiles with a valid signing identity” in XcodeAssign Your App to a Team in Xcode project settings of General|IdentityRegister new device on the apple development website or Xcode detected new device connected利用Xcode生成和管理的iOS Team Provisioning Profile來進行開發非常方便,可以不需要上網站手動生成下載Provisioning Profile。
Team Provisioning Profile同Provisioning Profile,隻不過是由Xcode自動生成的,也被配置到【XcodeTarget|Build Settings|Code Signing|Provisioning Profile】下。
6.證書與簽名
Code Signing Identity
Xcode中配置的Code Signing Identity《entitlements、certificate》必須與Provisioning Profile匹配,並且配置的Certificate必須在本機Keychain Access中存在對應Public/Private Key Pair,否則編譯會報錯。
Xcode所在的Mac設備《系統》使用CA證書《WWDRCA.cer》來判斷Code Signing Identity中Certificate的合法性:
若用WWDRCA公鑰能成功解密出證書並得到公鑰《Public Key》和內容摘要《Signature》,證明此證書確乃AppleWWDRCA發佈,即證書來源可信;再對證書本身使用哈希算法計算摘要,若與上一步得到的摘要一致,則證明此證書未被篡改過,即證書完整。
Code Signing
每個證書《其實是公鑰》對應Key Pair中的私鑰會被用來對內容進行數字簽名《CodeSign》——使用哈希算法生成內容摘要《digest》。
Xcode使用指定證書配套的私鑰進行簽名時需要授權,選擇【始終允許】後,以後使用該私鑰進行簽名便不會再彈出授權確認窗口。
Verify Code Signature with Certificate
上面已經提到,公鑰被包含在數字證書裡,數字證書又被包含在描述文件(Provisioning File)中,描述文件在應用被安裝的時候會被拷貝到iOS設備中。
第一步,App在Mac/iOS真機上啟動時,需要對配置的bundle ID、entitlements和certificate與Provisioning Profile進行匹配校驗.
第二步,iOS/Mac真機上的ios_development.cer被AppleWWDRCA.cer中的 public key解密校驗合法後,獲取每個開發證書中可信任的公鑰對App的可靠性和完整性進行校驗。
iOS/Mac設備《系統》使用App Provisioning Profile《Code Signing Identity》中的開發證書來判斷App的合法性:
若用證書公鑰能成功解密出App《executable code》的內容摘要《Signature》,證明此App確乃認證開發者發佈,即來源可信;再對App《executable code》本身使用哈希算法計算摘要,若與上一步得到的摘要一致,則證明此App《executable code》未被篡改過,即內容完整。
結:基於Provisioning Profile校驗了CodeSign的一致性;基於Certificate校驗App的可靠性和完整性;啟動時,真機的device ID《UUID》必須在Provisioning Profile的ProvisionedDevices授權之列。
7.在多臺機器上共享開發賬戶/證書
1.Xcode導出開發者賬號(*.developerprofile)和 PKCS12文件(*.p12)
進入Xcode Preferences|Accounts:選中Apple IDs列表中對應Account的的Email,點擊+-之後的☸|Export Apple ID And Code Signing Assets…,可導出包含account/code signing identity/provisioning profiles信息的*.developerprofile《Exporting a Developer Profile》文件供其他機器上的Xcode開發使用《Import該developerprofile》。
2.Keychain Access導出PKCS12文件(*.p12)Keychain Access|Certificates中選中欲導出的certificate或其下private key,右鍵Export或者通過菜單File|Export Items導出Certificates.p12——PKCS12 file holds theprivate keyand certificate。
其他Mac機器上雙擊Certificates.p12《如有密碼需輸入密碼》即可安裝該共享證書。
有了共享證書之後,在開發者網站上將欲調試的iOS設備註冊到該開發者賬號名下,並下載對應證書授權了iOS調試設備的Provisioning Profile文件,方可在iOS真機設備上開發調試。
8.其他
管理式證書一種新的管理證書方式,比較牛逼簡述:在更新xcode13後,蘋果上線了一種新的證書——雲管理式證書,包括Distribution Managed和Development Managed。
在打包或真機運行的時候可以使用雲管理式證書對其應用進行簽名,而且這種證書可以自動發起輪換,即不需要關心它的過期時間。
同時,既然叫雲管理證書,那也就不需要下載到本地鑰匙串了。
整個簽名過程在蘋果服務器線上完成。
蘋果的這個功能大大簡化了開發的步驟,過去在開發之前,需要配置和導入一系列證書。
而現在在一臺新電腦上進行開發和打包,隻需要登錄對應的Apple ID就可以直接編譯運行和打包了,其他事情不需要開發者關心。