轉(zhuǎn)自>曾夢想仗劍走天涯?
引言
? ? ? ? 關(guān)于開發(fā)證書配置(Certificates & Identifiers & Provisioning Profiles)瞻讽,相信做iOS開發(fā)的同學(xué)沒少被折騰。對于一個(gè)iOS開發(fā)小白饥悴、半吊子(比如像我自己)抑或老兵阐虚,或多或少會有或曾有過以下不詳宝剖、疑問乏冀、疑惑甚至困惑:
- 什么是App ID桅锄?Explicit/Wildcard App ID有何區(qū)別?什么是App Group ID鲫尊?
- 什么是證書(Certificate)痴柔?如何申請?有啥用疫向?
- 什么是Key Pair(公鑰/私鑰)咳蔚?有啥用?與證書有何關(guān)聯(lián)搔驼?
- 什么是簽名(Signature)谈火?如何簽名(CodeSign)?怎樣校驗(yàn)(Verify)舌涨?
- 什么是(Team)Provisioning Profiles糯耍?有啥用?
- Xcode如何配置才能使用iOS真機(jī)進(jìn)行開發(fā)調(diào)試囊嘉?
- 多臺機(jī)器如何共享開發(fā)者賬號或證書温技?
- 遇到證書配置問題怎么辦?
本文將圍繞相關(guān)概念做個(gè)系統(tǒng)的梳理串燒扭粱。
寫在前面
1.假設(shè)你使用過Apple設(shè)備(iMac/iPad/iPhone)且注冊過Apple ID(Apple Account)舵鳞。
2.假設(shè)你或你所在的開發(fā)組已加入蘋果開發(fā)者計(jì)劃(Enroll in iOS Developer Program to become a member),即已注冊開發(fā)者賬號(Apple Developer Account)琢蛤。
- 只有擁有開發(fā)者賬號蜓堕,才可以申請開發(fā)/發(fā)布證書及相關(guān)配置授權(quán)文件,進(jìn)而在iOS真機(jī)上開發(fā)調(diào)試Apps或發(fā)布到App Store博其。
- 開發(fā)者賬號分為Individual和Company/Organization兩種類型套才。如無特別交代,下文基于$99/Year的普通個(gè)人開發(fā)者(Individual)賬號展開慕淡。
3.若要真機(jī)調(diào)試實(shí)踐背伴,你必須至少擁有一臺裝有Mac OS X/Xcode的Mac開發(fā)機(jī)(iMac or MacBook),其上自帶原生的Keychain Access峰髓。
一.App ID(bundle identifier)
App ID即Product ID傻寂,用于標(biāo)識一個(gè)或者一組App。
App ID應(yīng)該和Xcode中的Bundle Identifier是一致(Explicit)的或匹配(Wildcard)的儿普。
App ID字符串通常以反域名(reverse-domain-name)格式的Company Identifier(Company ID)作為前綴(Prefix/Seed)崎逃,一般不超過255個(gè)ASCII字符。
App ID全名會被追加Application Identifier Prefix(一般為TeamID.)眉孩,分為兩類:
- Explicit App ID:唯一的App ID个绍,用于唯一標(biāo)識一個(gè)應(yīng)用程序。例如“com.apple.garageband”這個(gè)App ID浪汪,用于標(biāo)識Bundle Identifier為“com.apple.garageband”的App巴柿。
- Wildcard App ID:含有通配符的App ID,用于標(biāo)識一組應(yīng)用程序死遭。例如“*”(實(shí)際上是Application Identifier Prefix)表示所有應(yīng)用程序广恢;而“com.apple.*”可以表示Bundle Identifier以“com.apple.”開頭(蘋果公司)的所有應(yīng)用程序。
用戶可在網(wǎng)站上刪除(Delete)已注冊的App IDs呀潭。
App ID被配置到【XcodeTarget|Info|Bundle Identifier】下钉迷;對于Wildcard App ID至非,只要bundle identifier包含其作為Prefix/Seed即可。
二.設(shè)備(Device)
Device就是運(yùn)行iOS系統(tǒng)用于開發(fā)調(diào)試App的設(shè)備糠聪。每臺Apple設(shè)備使用UDID來唯一標(biāo)識荒椭。
iOS設(shè)備連接Mac后,可通過iTunes->Summary或者Xcode->Window->Devices獲取iPhone的UDID(identifier)舰蟆。
Apple Member Center網(wǎng)站個(gè)人賬號下的Devices中包含了注冊過的所有可用于開發(fā)和測試的設(shè)備趣惠,普通個(gè)人開發(fā)賬號每年累計(jì)最多只能注冊100個(gè)設(shè)備。
- Apps signed by you or your team run only on designated development devices.
- Apps run only on the test devices you specify.
用戶可在網(wǎng)站上啟用/禁用(Enable/Disable)已注冊的Device身害。
本文的Devices即連接到Xcode被授權(quán)用于開發(fā)測試的iOS設(shè)備(iPhone/iPad)味悄。
三.開發(fā)證書(Certificates)
1.證書的概念
證書是由公證處或認(rèn)證機(jī)關(guān)開具的證明資格或權(quán)力的證件,它是表明(或幫助斷定)事理的一個(gè)憑證塌鸯。
每個(gè)中國人一生可能需要70多個(gè)證件侍瑟,含15種身份證明。證件中“必需的”有30到40個(gè)界赔。將這些證件按時(shí)間順序鋪開丢习,那就是一個(gè)天朝子民的一生——持準(zhǔn)生證許可落地,以戶籍證明入籍淮悼,以身份證認(rèn)證身份咐低,持結(jié)婚證以合法同居,最終以死亡證明注銷袜腥。
2.數(shù)字證書的概念
數(shù)字證書就是互聯(lián)網(wǎng)通訊中標(biāo)志通訊各方身份信息的一串?dāng)?shù)字见擦,提供了一種在Internet上驗(yàn)證通信實(shí)體身份的方式,其作用類似于司機(jī)的駕駛執(zhí)照或日常生活中的身份證羹令。它是由一個(gè)由權(quán)威機(jī)構(gòu)——CA機(jī)構(gòu)鲤屡,又稱為證書授權(quán)(Certificate Authority)中心發(fā)行的,人們可以在網(wǎng)上用它來識別對方的身份福侈。
- 數(shù)字證書是一個(gè)經(jīng)證書授權(quán)中心數(shù)字簽名的包含公開密鑰擁有者信息以及公開密鑰的文件酒来。最簡單的證書包含一個(gè)公開密鑰、名稱以及證書授權(quán)中心的數(shù)字簽名肪凛。
- 數(shù)字證書還有一個(gè)重要的特征就是時(shí)效性:只在特定的時(shí)間段內(nèi)有效堰汉。
某一認(rèn)證領(lǐng)域內(nèi)的根證書是CA認(rèn)證中心給自己頒發(fā)的證書,是信任鏈的起始點(diǎn)伟墙。安裝根證書意味著對這個(gè)CA認(rèn)證中心的信任翘鸭。
在天朝子民的一生中,戶籍證明可理解為等效的根證書:有了戶籍證明戳葵,才能辦理身份證就乓;有了上流的身份證,才能辦理下游居住證、結(jié)婚證生蚁、計(jì)劃生育證噩翠、駕駛執(zhí)照等認(rèn)證。
3.iOS(開發(fā))證書
iOS證書是用來證明iOS App內(nèi)容(executable code)的合法性和完整性的數(shù)字證書守伸。對于想安裝到真機(jī)或發(fā)布到AppStore的應(yīng)用程序(App)绎秒,只有經(jīng)過簽名驗(yàn)證(Signature Validated)才能確保來源可信浦妄,并且保證App內(nèi)容是完整尼摹、未經(jīng)篡改的。
iOS證書分為兩類:Development和Production(Distribution)剂娄。
- Development證書用來開發(fā)和調(diào)試應(yīng)用程序:A?development certificate?identifies you, as a team member, in a development provisioning profile that allows apps signed by you to?launch?on devices.?
- Production主要用來分發(fā)應(yīng)用程序(根據(jù)證書種類有不同作用):A?distribution certificate?identifies your team or organization in a distribution provisioning profile and allows you to?submit ?your app to the store. Only a team agent or an admin can create a distribution certificate.
普通個(gè)人開發(fā)賬號最多可注冊iOS Development/Distribution證書各2個(gè)蠢涝,用戶可在網(wǎng)站上刪除(Revoke)已注冊的Certificate。下文主要針對開發(fā)調(diào)試階段的Development證書阅懦。
下文主要針對iOS App開發(fā)調(diào)試過程中的開發(fā)證書(Certificate for Development)和二。
4.iOS(開發(fā))證書的根證書
那么,iOS開發(fā)證書是誰頒發(fā)的呢耳胎?或者說我們是從哪個(gè)CA申請到用于Xcode開發(fā)調(diào)試的證書呢惯吕?
iOS以及Mac OS X系統(tǒng)(在安裝Xcode時(shí))將自動(dòng)安裝AppleWWDRCA.cer這個(gè)中間證書(Intermediate Certificates),它實(shí)際上就是iOS(開發(fā))證書的證書怕午,即根證書(Apple Root Certificate)废登。
AppleWWDRCA(Apple Root CA)類似注冊管理戶籍的公安機(jī)關(guān)戶政管理機(jī)構(gòu),AppleWWDRCA.cer之于iOS(開發(fā))證書則好比戶籍證之于身份證郁惜。
如果Mac Keychain Access證書助理在申請證書時(shí)尚未安裝過該證書堡距,請先下載安裝(Signing requires that you have both the signing identity and the intermediate certificate installed in your keychain)。
![]()
5.申請證書(CSR:Certificate Signing Request)
可以在缺少證書時(shí)通過Xcode Fix Issue自動(dòng)請求證書兆蕉,這里通過Keychain證書助理從證書頒發(fā)機(jī)構(gòu)請求證書:填寫開發(fā)賬號郵件和常用名稱羽戒,勾選【存儲到磁盤】。
![]()
keychain將生成一個(gè)包含開發(fā)者身份信息的CSR(Certificate Signing Request)文件虎韵;同時(shí)易稠,Keychain Access|Keys中將新增一對Public/Private?Key Pair(This?signing identity?consists of a public-private key pair that Apple issues)。
![]()
private key始終保存在Mac OS的Keychain Access中包蓝,用于簽名(CodeSign)對外發(fā)布的App驶社;public key一般隨證書(隨Provisioning Profile,隨App)散布出去养晋,對App簽名進(jìn)行校驗(yàn)認(rèn)證衬吆。用戶必須保護(hù)好本地Keychain中的private key,以防偽冒绳泉。
- Keep a secure backup of your public-private key pair. If the private key is lost, you’ll have to create an?entirely new identity to sign code.?
- Worse, if someone else has your private key, that person may be able to?impersonate?you.
在Apple開發(fā)網(wǎng)站上傳該CSR文件來添加證書(Upload CSR file to generate your certificate):
![]()
Apple證書頒發(fā)機(jī)構(gòu)WWDRCA(Apple Worldwide Developer Relations Certification Authority)將使用private key對CSR中的public key和一些身份信息進(jìn)行加密簽名生成數(shù)字證書(ios_development.cer)并記錄在案(Apple Member Center)逊抡。
![]()
從Apple?Member Center網(wǎng)站下載證書到Mac上雙擊即可安裝(當(dāng)然也可在Xcode中添加開發(fā)賬號自動(dòng)同步證書和[生成]配置文件)。證書安裝成功后,在KeychainAccess|Keys中展開創(chuàng)建CSR時(shí)生成的Key Pair中的私鑰前面的箭頭冒嫡,可以查看到包含其對應(yīng)公鑰的證書(Your requested certificate will be the public half of the key pair.)拇勃;在Keychain Access|Certificates中展開安裝的證書(ios_development.cer)前面的箭頭,可以看到其對應(yīng)的私鑰孝凌。
![]()
![]()
Certificate被配置到【Xcode?Target|Build Settings|Code Signing|Code Signing Identity】下方咆,下拉選擇Identities from Profile "..."(一般先配置Provisioning Profile)。以下是Xcode配置示例:
![]()
四.供應(yīng)配置文件(Provisioning Profiles)
1.Provisioning Profile的概念
Provisioning Profile文件包含了上述的所有內(nèi)容:證書蟀架、App ID和設(shè)備瓣赂。
![]()
一個(gè)Provisioning Profile對應(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)已注冊的Provisioning Profiles。
Provisioning Profile決定Xcode用哪個(gè)證書(公鑰)/私鑰組合(Key Pair/Signing Identity)來簽署應(yīng)用程序(Signing Product),將在應(yīng)用程序打包時(shí)嵌入到.ipa包里纲缓。安裝應(yīng)用程序時(shí)卷拘,Provisioning Profile文件被拷貝到iOS設(shè)備中,運(yùn)行該iOS App的設(shè)備也通過它來認(rèn)證安裝的程序祝高。
如果要打包或者在真機(jī)上運(yùn)行一個(gè)APP栗弟,一般要經(jīng)歷以下三步:
- 首先,需要證書對應(yīng)的私鑰來進(jìn)行簽名褂策,用于標(biāo)識這個(gè)APP是合法横腿、安全、完整的斤寂;
- 其次耿焊,需要指明它的App ID,并且驗(yàn)證Bundle ID是否與其一致遍搞;
- 然后罗侯,如果是真機(jī)調(diào)試,需要確認(rèn)這臺設(shè)備是否授權(quán)運(yùn)行該APP溪猿。
Provisioning Profile把這些信息全部打包在一起钩杰,方便我們在調(diào)試和發(fā)布程序打包時(shí)使用。這樣诊县,只要在不同的情況下選擇不同的Provisioning Profile文件就可以了讲弄。
Provisioning Profile也分為Development和Distribution兩類,有效期同Certificate一樣依痊。Distribution版本的ProvisioningProfile主要用于提交App Store審核避除,其中不指定開發(fā)測試的Devices(0,unlimited)。App ID為Wildcard App ID(*)瓶摆。App Store審核通過上架后凉逛,允許所有iOS設(shè)備(Deployment Target)上安裝運(yùn)行該App。
Xcode將全部供應(yīng)配置文件(包括用戶手動(dòng)下載安裝的和Xcode自動(dòng)創(chuàng)建的Team Provisioning Profile)放在目錄~/Library/MobileDevice/Provisioning Profiles下群井。
2.Provisioning Profile的構(gòu)成
以下為典型供應(yīng)配置文件*.mobileprovision的構(gòu)成簡析:
(1)Name:該mobileprovision的文件名状飞。
(2)UUID:該mobileprovision文件的真實(shí)文件名。
(3)TeamName:Apple ID賬號名书斜。
(4)TeamIdentifier:Team Identity诬辈。
(5)AppIDName:explicit/wildcard App ID name(ApplicationIdentifierPrefix)。
(6)ApplicationIdentifierPrefix:完整App ID的前綴(TeamIdentifier.*)菩佑。
(7)DeveloperCertificates:包含了可以為使用該配置文件應(yīng)用簽名的所有證書<data><array>自晰。
證書是基于Base64編碼,符合PEM(PrivacyEnhanced Mail, RFC 1848)格式的稍坯,可使用OpenSSL來處理(opensslx509 -text -in file.pem)。
從DeveloperCertificates提取<data></data>之間的內(nèi)容到文件cert.cer(cert.perm):
-----BEGIN CERTIFICATE-----
將<data></data>之間的內(nèi)容拷貝至此
-----END CERTIFICATE-----`
Mac下右鍵QuickLook查看cert.cer(cert.perm)搓劫,在Keychain Access中右鍵Get Info查看對應(yīng)證書ios_development.cer瞧哟,正常情況(公私鑰KeyPair配對)應(yīng)吻合;Windows下沒有足夠信息(WWDRCA.cer)枪向,無法驗(yàn)證該證書勤揩。
如果你用了一個(gè)不在這個(gè)列表中的證書進(jìn)行簽名,無論這個(gè)證書是否有效秘蛔,這個(gè)應(yīng)用都將CodeSign Fail陨亡。
(8)Entitlements鍵<key>對應(yīng)的<dict>:
keychain-access-groups:$(AppIdentifierPrefix),參見Code Signing Entitlements(*.entitlements)深员。
每個(gè)應(yīng)用程序都有一個(gè)可以用于安全保存一些如密碼负蠕、認(rèn)證等信息的keychain,一般而言自己的程序只能訪問自己的keychain倦畅。通過對應(yīng)用簽名時(shí)的一些設(shè)置遮糖,還可以利用keychain的方式實(shí)現(xiàn)同一開發(fā)者簽證(就是相同bundle seed)下的不同應(yīng)用之間共享信息的操作。比如你有一個(gè)開發(fā)者帳戶叠赐,并開發(fā)了兩個(gè)不同的應(yīng)用A和B欲账,然后通過對A和B的keychain access group這個(gè)東西指定共用的訪問分組,就可以實(shí)現(xiàn)共享此keychain中的內(nèi)容芭概。
application-identifier:帶前綴的全名赛不,例如$(AppIdentifierPrefix)com.apple.garageband。
com.apple.security.application-groups:App Group ID(group. com.apple)罢洲,參見Code Signing Entitlements(*.entitlements)踢故。
com.apple.developer.team-identifier:同Team Identifier。
(9)ProvisionedDevices:該mobileprovision授權(quán)的開發(fā)設(shè)備的UDID <array>。
Provisioning Profile被配置到【XcodeTarget|Build Settings|Code Signing|Provisioning Profile】下畴椰,然后在Code Signing Identity下拉可選擇Identities from Profile "..."(即Provisioning Profile中包含的Certificates)臊诊。
五.開發(fā)組供應(yīng)配置文件(Team Provisioning Profiles)
1.Team?Provisioning Profile的概念
每個(gè)Apple開發(fā)者賬號都對應(yīng)一個(gè)唯一的Team ID,Xcode3.2.3預(yù)發(fā)布版本中加入了Team Provisioning Profile這項(xiàng)新功能斜脂。
在Xcode中添加Apple Developer Account時(shí)抓艳,它將與Apple Member Center后臺勾兌自動(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è)eam注冊的所有設(shè)備上調(diào)試所有的應(yīng)用程序(不管bundleidentifier是什么)玷或。同時(shí),它還會為開發(fā)者自己創(chuàng)建的Wildcard/Explicit App IDs創(chuàng)建對應(yīng)的iOS Team Provisioning Profile片任。
![]()
2.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來進(jìn)行開發(fā)非常方便偏友,可以不需要上網(wǎng)站手動(dòng)生成下載Provisioning Profile。
Team Provisioning Profile同Provisioning Profile对供,只不過是由Xcode自動(dòng)生成的位他,也被配置到【XcodeTarget|Build Settings|Code Signing|Provisioning Profile】下。
六.App Group (ID)
1.App Group的概念
WWDC14除了發(fā)布了OS X v10.10和switf外产场,iOS 8.0也開始變得更加開放了鹅髓。說到開放,當(dāng)然要數(shù)應(yīng)用擴(kuò)展(App Extension)了京景。顧名思義窿冯,應(yīng)用擴(kuò)展允許開發(fā)者擴(kuò)展應(yīng)用的自定義功能和內(nèi)容,能夠讓用戶在使用其他應(yīng)用程序時(shí)使用該項(xiàng)功能确徙,從而實(shí)現(xiàn)各個(gè)應(yīng)用程序間的功能和資源共享醒串。可以將擴(kuò)展理解為一個(gè)輕量級(nimble and lightweight)的分身鄙皇。
擴(kuò)展和其Containing App各自擁有自己的沙盒芜赌,雖然擴(kuò)展以插件形式內(nèi)嵌在Containing App中,但是它們是獨(dú)立的二進(jìn)制包育苟,不可以互訪彼此的沙盒较鼓。為了實(shí)現(xiàn)Containing App與擴(kuò)展的數(shù)據(jù)共享,蘋果在iOS 8中引入了一個(gè)新的概念——App Group违柏,它主要用于同一Group下的APP實(shí)現(xiàn)數(shù)據(jù)共享博烂,具體來說是通過以App Group ID標(biāo)識的共享資源區(qū)——App Group Container。
App Group ID同App ID一樣漱竖,一般不超過255個(gè)ASCII字符禽篱。用戶可在網(wǎng)站上編輯Explicit App IDs的App Group Assignment;可以刪除(Delete)已注冊的AppGroup (ID)馍惹。
2.App Group的配置
Containing App與Extension的Explicit App ID必須Assign到同一App Group下才能實(shí)現(xiàn)數(shù)據(jù)共享躺率,并且Containing App與Extension的App ID命名必須符合規(guī)范:
- 置于同一App Group下的App IDs必須是唯一的(Explicit玛界,not Wildcard)
- Extension App ID以Containing App ID為Prefix/Seed
假如Garageband這個(gè)App ID為“com.apple.garageband”,則支持從語音備忘錄導(dǎo)入到Garageband應(yīng)用的插件的App ID可能形如“com.apple.garageband.extImportRecording”悼吱。
?
App(ex)
?
App Group ID
Provisioning Profile
Code Signing Identity
(Certificate Key Pair)
App ID
(bundle identifier)
Devices
(test)
GarageBand
置于同一分組:
group.com.apple
(1)共用同一證書:ios_development.cer
(2)共用證書Key Pair中的Private Key進(jìn)行CodeSign
com.apple.garageband
授權(quán)開發(fā)測試設(shè)備的UDIDs
GarageBand擴(kuò)展插件
com.apple.garageband.extImportRecording
關(guān)于Provisioning Profile慎框,可以使用自己手動(dòng)生成的,也可以使用Xcode自動(dòng)生成的Team Provisioning Profile后添。
App Group會被配置到【Xcode Target|Build Settings|Code Signing|Code Signing Entitlements】文件(*.entitlements)的鍵com.apple.security.application-groups下笨枯,不影響Provisioning Profile生成流程。
七.證書與簽名(Certificate& Signature)
1.Code Signing Identity
![]()
![]()
2.Code Signing
每個(gè)證書(其實(shí)是公鑰)對應(yīng)Key Pair中的私鑰會被用來對內(nèi)容(executable code遇西,resources such as images and nib files aren’t signed)進(jìn)行數(shù)字簽名(CodeSign)——使用哈希算法生成內(nèi)容摘要(digest)馅精。上面已經(jīng)提到,公鑰被包含在數(shù)字證書里粱檀,數(shù)字證書又被包含在描述文件(Provisioning File)中洲敢,描述文件在應(yīng)用被安裝的時(shí)候會被拷貝到iOS設(shè)備中。
Xcode使用指定證書配套的私鑰進(jìn)行簽名時(shí)需要授權(quán)茄蚯,選擇【始終允許】后压彭,以后使用該私鑰進(jìn)行簽名便不會再彈出授權(quán)確認(rèn)窗口。
![]()
3.Verify Code Signature with Certificate
![]()
iOS/Mac機(jī)上的ios_development.cer可以被AppleWWDRCA.cer中的 public key解密第队,從而獲取每個(gè)開發(fā)證書中可信任的公鑰哮塞。
(1).iOS/Mac設(shè)備(系統(tǒng))使用CA證書(WWDRCA.cer)來判斷App Provisioning Profile(Code Signing Identity)中的開發(fā)證書的合法性:
- 若用WWDRCA公鑰能成功解密出證書并得到公鑰(Public Key)和內(nèi)容摘要(Signature),證明此證書確乃AppleWWDRCA發(fā)布凳谦,即證書來源可信;
- 再對證書本身使用哈希算法計(jì)算摘要衡未,若與上一步得到的摘要一致尸执,則證明此證書未被篡改過,即證書完整缓醋。
(2).iOS/Mac設(shè)備(系統(tǒng))使用App Provisioning Profile(Code Signing Identity)中的開發(fā)證書來判斷App的合法性:
- 若用證書公鑰能成功解密出App(executable code)的內(nèi)容摘要(Signature)如失,證明此App確乃認(rèn)證開發(fā)者發(fā)布,即來源可信送粱;
- 再對App(executable code)本身使用哈希算法計(jì)算摘要褪贵,若與上一步得到的摘要一致,則證明此App(executable code)未被篡改過抗俄,即內(nèi)容完整脆丁。
八.在多臺機(jī)器上共享開發(fā)賬戶/證書
1.Xcode導(dǎo)出開發(fā)者賬號(*.developerprofile)或PKCS12文件(*.p12)
進(jìn)入Xcode Preferences|Accounts:
- 選中Apple IDs列表中對應(yīng)Account的的Email,點(diǎn)擊+-之后的?|Export Accounts动雹,可導(dǎo)出包含account/code signing identity/provisioning profiles信息的*.developerprofile(Exporting a Developer Profile)文件供其他機(jī)器上的Xcode開發(fā)使用(Import該Account)槽卫。
選中右下列表中某行Account Name條目|ViewDetails,可以查看Signing Identities和Provisioning Profiles胰蝠。
- 選中欲導(dǎo)出的Signing Identity條目歼培,點(diǎn)擊欄底+之后的?|Export震蒋,必須輸入密碼,并需授權(quán)export key "privateKey" from keychain躲庄,將導(dǎo)出Certificates.p12查剖。
點(diǎn)擊左下角的刷新按鈕可從Member Center同步該賬號下所有的Provisioning Profile到本地。
選中右擊列表中某個(gè)Provisioning Profile可以【Show in Finder】到[~/Library/MobileDevice/Provisioning\ Profiles]目錄噪窘,其中Provisioning Profile的真實(shí)名稱為$(UUID).mobileprovision笋庄,名如"2488109f-ff65-442e-9774-fd50bd6bc827.mobileprovision",其中<key>Name</key>中為Xcode中看到的描述性別名效览。
2.Keychain Access導(dǎo)出PKCS12文件(*.p12)
在Keychain Access|Certificates中選中欲導(dǎo)出的certificate或其下private key无切,右鍵Export或者通過菜單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è)備注冊到該開發(fā)者賬號名下,并下載對應(yīng)證書授權(quán)了iOS調(diào)試設(shè)備的Provisioning Profile文件瘦锹,方可在iOS真機(jī)設(shè)備上開發(fā)調(diào)試籍嘹。
九.證書配置常見錯(cuò)誤
1.no such provisioning profile was found
Xcode Target|Genera|Identity Team下提示"Your build settings specify a provisioning profile with the UUID "xxx",howerver, no such provisioning profile was found."
Xcode Target|BuildSettings|Code Signing|當(dāng)前配置的指定UDID的provisioning profile在本地不存在,此時(shí)需要更改Provisioning Profile弯院。必要時(shí)手動(dòng)去網(wǎng)站下載或重新生成Provisioning Profile或直接在Xcode中Fix issue予以解決(可能自動(dòng)生成iOS Team ProvisioningProfile)辱士!
2.No identities from profile
Build Settings|CodeSigning的Provisioning Profile中選擇了本地安裝的provisioning profile之后,Code Signing Identity中下拉提示No identities from profile “…”or No identities from keychain.
Xcode配置指定UDID的provisioning profile中的DeveloperCertificates在本地KeyChain中不存在(No identities are available)或不一致(KeyPair中的Private Key丟失)听绳,此時(shí)需去網(wǎng)站檢查ProvisioningProfile中的App ID-Certificate-Device配置是否正確颂碘。如果是別人提供的共享賬號(*.developerprofile)或共享證書(*.p12),請確保導(dǎo)出了對應(yīng)Key Pair中的Private Key椅挣。必要時(shí)也直接在Xcode中Fix issue予以解決(可能自動(dòng)生成iOS Team ProvisioningProfile)头岔。
3.Code Signing Entitlements file do not match profile
"Invalid application-identifier Entitlement" or "Code Signing Entitlements file do not match those specified in your provisioning profile.(0xE8008016)."
(1)檢查對應(yīng)版本(Debug)指定的*.entitlements文件中的“Keychain Access Groups”鍵值是否與ProvisioningProfile中的Entitlements項(xiàng)相吻合(后者一般為前者的Prefix/Seed)。
(2)也可以將Build Settings|Code Signing的Provisioning Profile中對應(yīng)版本(Debug)的Entitlements置空鼠证。
4.Xcode配置反應(yīng)有時(shí)候不那么及時(shí)峡竣,可刷新、重置相關(guān)配置項(xiàng)開關(guān)(若有)或重啟Xcode試試量九。
參考:
《iPhone真機(jī)調(diào)試應(yīng)用程序》《iOS Developer:真機(jī)測試》
《iOS Development--Certificates, Provisioning Profiles》
《關(guān)于Certificate适掰、Provisioning
Profile、App ID的介紹及其關(guān)系》
《數(shù)字簽名和數(shù)字證書》《iOS keyChain 研究》
《蘋果開發(fā)者賬號那些事兒》《iOS關(guān)於Provisioning
Profiles這些事》
《iOS Code Signing 學(xué)習(xí)筆記》《代碼簽名探析/Inside Code Signing》
《iOS Code Signing: 解惑/iOS Code Signing: Under The Hood》