標籤:certificate app_id provisioning_profile app_group codesigning
關於開發認證配置(Certificates&Identifiers&Provisioning Profiles),相信做iOS開發的同學沒少被折騰,本文將對相關概念做個系統的梳理。
在進行iOS認證申請之前,假設你使用過Apple裝置且註冊過Apple ID。首先,必須加入蘋果開發人員計劃(Enrollin iOS Developer Program to become a member),分為Individual和Company/Organization兩種類型。
下文主要基於個人開發人員帳號(Individual):$99/Year。
一
.認證(
Certificates)
顧名思義,認證是用來證明內容(App的CodeSign)的合法性和完整性的。對於發布到AppStore/安裝到真機的應用程式(App),只有經過簽名驗證(CodeSign)才能確保來源可信,並且保證代碼是完整、未經篡改的。
認證分為兩類:Development和Production(Distribution)。
- Development認證用來開發和調試應用程式;
- Production主要用來分發應用程式(根據認證種類有不同作用)。
下文主要針對開發調試階段的Development認證。
二
.App ID(
bundle identifier)
App ID用於標識一個或者一組App,AppID應該是和Xcode中的Bundle Identifier是一致的或者匹配的。
App ID字串通常是反網域名稱(reverse-domain-name)格式的CompanyIdentifier(Company ID)作為首碼(Prefix/Seed)。
App ID分為兩類:
- Explicit App ID:唯一的App ID,這種App ID用於唯一標識一個應用程式。例如“com.apple.garageband”這個App ID,用於標識Bundle Identifier為“com.apple.garageband”的程式。
- Wildcard App ID:萬用字元App ID,用於標識一組應用程式。例如“*”表示所有應用程式;而“com.apple.*”可以表示以“com.apple.”開頭的所有應用程式。
三
.裝置(
Device)
Device就是運行iOS系統用於開發調試iOS App的裝置,每台裝置使用UDID來唯一標識。iOS裝置串連Mac後,可通過iTunes->Summary或者Xcode->Window->Devices擷取iPhone的UDID(identifier)。
Devices中包含了該賬戶中所有可用於開發與測試的裝置,普通個人開發帳號每年最多隻能註冊100個裝置。
- Apps signed by you or your team run only on designated development devices.
- Apps run only on the test devices you specify.
四
.供應設定檔(Provisioning Profiles
)
Provisioning Profile檔案包含了上述的所有內容:認證、App ID、裝置。它決定Xcode用哪個認證(公開金鑰)/私密金鑰組合(KeyPair)來簽署應用程式(Signing Product),將在應用程式打包時嵌入到.ipa包裡。安裝應用程式時,Provisioning Profile檔案被拷貝到iOS裝置中,運行該iOS App的裝置也通過它來認證安裝的程式。
如果要打包或者在真機上運行一個APP,一般要經曆以下三步:
- 首先,需要認證來進行簽名,用於標識這個APP是合法、安全、完整的;
- 其次,需要指明它的App ID,並且驗證Bundle ID是否與其一致;
- 然後,如果是真機調試,需要確認這台裝置是否授權運行該APP。
Provisioning Profile把這些資訊全部打包在一起,方便我們在調試和發布程式打包時使用。這樣,只要在不同的情況下選擇不同的ProvisioningProfile檔案就可以了。
Provisioning Profile也分為Development和Distribution兩類,有效期間同Certificate一樣。
五
.開發組供應設定檔(Team Provisioning Profiles
)
Xcode3.2.3預發布版本中加入了Team ProvisioningProfile這項新功能。
在Xcode中添加Apple Developer Account時,它將與Apple Dev Center後台勾兌自動產生iOSTeamProvisioning Profile(Managed by Xcode)。
Team Provisioning Profile包含一個為Xcode iOS Wildcard App ID(*)產生的iOS Team Provisioning Profile:*(匹配所有應用程式),賬戶裡所有的Development Certificates和Devices都可以使用它在這個eam註冊的所有裝置上調試所有的應用程式(不管bundleidentifier是什麼)。同時,它還會為開發人員自己建立的Wildcard/Explicit App IDs建立對應的iOSTeam Provisioning Profile。
Team Provisioning Profile產生/更新時機:
- (1).Add an Apple ID account to Xcode
- (2).Fix issue "No Provisioning Profiles with a valid signingidentity" in Xcode
- (3).Assign Your App to a Team in Xcode project settings ofGeneral|Identity
- (4).Register new device on the apple development website or Xcodedetected new device connected
利用Xcode產生和管理的iOS Team Provisioning Profile來進行開發非常方便,可以不需要上網站手動產生下載Provisioning Profile。
六
.App Group
WWDC14除了發布了OS X v10.10和switf外,iOS 8.0也開始變得更加開放了。說到開放,當然要數應用擴充(AppExtension)了。顧名思義,應用擴充允許開發人員擴充應用的自訂功能和內容,能夠讓使用者在使用其他應用程式時使用該項功能,從而實現各個應用程式間的功能和資源共用。可以將擴充理解為一個輕量級(nimbleand lightweight)的分身。
擴充和其Containing App各自擁有自己的沙箱,雖然擴充以外掛程式形式內嵌在ContainingApp中,但是它們是獨立的二進位包,不可以互訪彼此的沙箱。為了實現Containing App與擴充的資料共用,蘋果在iOS 8中引入了一個新的概念——App Group,它主要用於同一Group下的APP實現資料共用,具體來說是通過以App Group ID標識的共用資源區——App Group Container。
置於同一App Group下的一組AppIDs必須是唯一的(Explicit),並且ContainingApp與Extension的App ID命名必須符合規範。一般Extension的App ID以Containing App為Seed,假如Garageband這個App(App ID=“com.apple.garageband”),則支援從語音備忘錄匯入到Garageband應用的外掛程式的AppID可能形如“com.apple.garageband.extImportRecording”。
七
.認證與簽名(
Certificate& Signature)
通過Keychain認證助理手動申請開發認證時(也可通過Xcode自動請求產生),keychain將產生一個包含開發人員身份資訊的CSR(Certificate Signing Request)檔案,Keychain Access|Keys中將新增一對Public/Private Key Pair。
在Apple開發網站上傳該CSR檔案,Apple憑證授權單位WWDRCA(Apple Worldwide Developer Relations Certification Authority)將使用WWDR private key對CSR中的publick key進行加密簽名產生數位憑證(ios_development.cer)。
下載認證到Mac上雙擊安裝後,在KeychainAccess|Keys中展開CSR產生Key Pair中的私密金鑰前面的箭頭,可以查看到包含其對應公開金鑰的認證(Your requested certificate will bethe public half of the key pair.);在KeychainAccess|Certificates中展開安裝的認證(ios_development.cer)前面的箭頭,可以看到其對應的私密金鑰。
每個認證(其實是公開金鑰)對應的私密金鑰會被用來對內容(executable code,resources such as images and nib files aren’t signed)進行數字簽名(CodeSign)——使用雜湊演算法產生內容摘要(digest)。上面已經提到,公開金鑰被包含在數位憑證裡,數位憑證又被包含在描述檔案(ProvisioningFile)中,描述檔案在應用被安裝的時候會被拷貝到iOS裝置中。
另一方面,iOS系統以及MacOS X系統(在安裝Xcode時)將自動安裝AppleWWDRCA.cer這個Intermediate Certificates。如果Mac Keychain Access認證助理在申請認證時尚未安裝過該認證,請先下載安裝。iOS/Mac機上的ios_development.cer可以被AppleWWDRCA.cer中的 public key解密,從而擷取每個開發認證中可信任的公開金鑰。
iOS/Mac裝置(系統)使用AppProvisioning Profile認證中的公開金鑰來判斷App程式碼簽署的合法性:
- (1)若用公開金鑰能成功解密得到內容摘要,證明此內容確乃認證開發人員發布,即來源可信;
- (2)再對內容本身使用雜湊演算法計算摘要,若與上一步得到的摘要一致,則證明內容未被篡改過,即內容可信。
八
.在多台機器上實現開發賬戶/認證共用
若在Xcode Preferences添加了該Accounts,選中Team條目|ViewDetails:可以查看Signing Identities和ProvisioningProfiles。
- 選中欲匯出的Account,點擊+-之後的?|ExportAccounts,可匯出包含account/code signingidentity/provisioning profiles資訊的*.developerprofile(Exporting a Developer Profile)檔案供其他機器上的Xcode開發使用(Import該Account)。
- 選中欲匯出的Signing Identity條目,點擊欄底+之後的?|Export,必須輸入密碼,並需授權exportkey "privateKey" from keychain,將匯出Certificates.p12;或在Keychain Access|Certificates中選中欲匯出的certificate或其下private key,右鍵Export或者通過菜單File|Export Items匯出Certificates.p12。
其他Mac機器上雙擊Certificates.p12(如有密碼需輸入密碼)即可安裝該共用認證,在開發人員網站上將欲調試的iOS裝置註冊到該開發人員帳號名下,並下載對應認證授權了iOS調試裝置的Provisioning Profile檔案即可在iOS真機裝置上開發調試。
參考:
《iPhone真機調試應用程式》《iOS Developer:真機測試》
《關於Certificate、Provisioning Profile、App ID的介紹及其關係》
《iOS Development--Certificates, Provisioning Profiles》
《數位簽章和數位憑證》《蘋果開發人員帳號那些事兒》
《程式碼簽署探析/Inside Code Signing》《iOS Code Signing 學習筆記》
iOS認證相關概念詳解