国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > iOS > 正文

iOS Provisioning Profile(Certificate)與Code Signing詳解

2019-11-09 17:12:20
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

引言

        關(guān)于開發(fā)證書配置(Certificates & Identifiers & PRovisioning Profiles),相信做iOS 開發(fā)的同學(xué)沒(méi)少被折騰。對(duì)于一個(gè) iOS 開發(fā)小白、半吊子(比如像我自己)抑或老兵,或多或少會(huì)有或曾有過(guò)以下不詳、疑問(wèn)、疑惑甚至困惑:

什么是App ID?Explicit/Wildcard App ID有何區(qū)別?什么是App Group ID?什么是證書(Certificate)?如何申請(qǐng)?有啥用?什么是Key Pair(公鑰/私鑰)?有啥用?與證書有何關(guān)聯(lián)?什么是簽名(Signature)?如何簽名(CodeSign)?怎樣校驗(yàn)(Verify)?什么是(Team)Provisioning Profiles?有啥用?Xcode如何配置才能使用iOS真機(jī)進(jìn)行開發(fā)調(diào)試?多臺(tái)機(jī)器如何共享開發(fā)者賬號(hào)或證書?遇到證書配置問(wèn)題怎么辦?Xcode 7免證書調(diào)試真機(jī)調(diào)試

本文將圍繞相關(guān)概念及背景做個(gè)系統(tǒng)的梳理串燒,于條分縷析中對(duì)證書體系進(jìn)行抽絲剝繭,逐步揭開簽名機(jī)制的神秘面紗。圖窮匕首見(jiàn),水落而石出,包教不包會(huì),不會(huì)請(qǐng)?jiān)賮?lái)。

從 Xcode 7 開始支持普通 Apple 賬號(hào)進(jìn)行免證書真機(jī)調(diào)試,詳情參考最新官方文檔《Launching Your App on Devices》,或參考本文最后一節(jié)簡(jiǎn)介。

寫在前面

1.假設(shè)你使用過(guò) Apple 設(shè)備(iMac/ipad/iPhone)且注冊(cè)過(guò) Apple ID(Apple Account),詳情參考《創(chuàng)建和開始使用 Apple ID》。

2.假設(shè)你或你所在的開發(fā)組已加入蘋果開發(fā)者計(jì)劃(Enroll in iOS Developer Program to become amember),即已注冊(cè)開發(fā)者賬號(hào)(Apple Developer Account)。

只有擁有開發(fā)者賬號(hào),才可以申請(qǐng)開發(fā)/發(fā)布證書及相關(guān)配置授權(quán)文件,進(jìn)而在 iOS 真機(jī)上開發(fā)調(diào)試 Apps 或發(fā)布到 App Store。開發(fā)者賬號(hào)分為 Individual 和 Company/Organization 兩種類型。如無(wú)特別交代,下文基于 $99/Year 的普通個(gè)人開發(fā)者(Individual)賬號(hào)展開。

3.若要真機(jī)調(diào)試實(shí)踐,你必須至少擁有一臺(tái)裝有 Mac OS X/Xcode 的 Mac 開發(fā)機(jī)(iMac or MacBook),其上自帶原生的 Keychain access

.App ID(bundle identifier)

在蘋果官方的開發(fā)者計(jì)劃(Apple Developer Member Center)層面,App ID 即 Product ID,用于標(biāo)識(shí)一個(gè)或者一組 App。

在 Mac/iOS 開發(fā)語(yǔ)境中,bundle(捆綁) 是指一個(gè)內(nèi)部結(jié)構(gòu)按照標(biāo)準(zhǔn)規(guī)則組織的特殊目錄。在 Mac OS 應(yīng)用程序目錄下的某個(gè) *.app 上可右鍵顯示包內(nèi)容(Contents),其本質(zhì)上就是可執(zhí)行二進(jìn)制文件(MacOS/)及其資源(Resources/)的打包組合。因此,在 Xcode 中配置的 Bundle Identifier 必須和 App ID 是一致的(Explicit)或匹配的(Wildcard)。

App ID 字符串通常以反域名(reverse-domain-name)格式的 Company Identifier(Company ID)作為前綴(Prefix/Seed),一般不超過(guò) 255 個(gè) ASCII 字符。

App ID 全名會(huì)被追加 application Identifier Prefix(一般為 TeamID.),分為兩類:

Explicit App ID:唯一的 App ID,用于唯一標(biāo)識(shí)一個(gè)應(yīng)用程序。例如“com.apple.garageband”這個(gè) App ID,用于標(biāo)識(shí) Bundle Identifier 為“com.apple.garageband”的 App——GarageBand;“com.tencent.mQQ”則為iPhoneQQ 的 App ID。Wildcard App ID:含有通配符的 App ID,用于標(biāo)識(shí)一組應(yīng)用程序。例如“*”(實(shí)際上是 Application Identifier Prefix)表示所有應(yīng)用程序;而“com.apple.*”可以表示 Bundle Identifier 以“com.apple.”開頭(蘋果公司)的所有應(yīng)用程序。用戶可在 Developer Member Center 網(wǎng)站上注冊(cè)(Register)或刪除(Delete)已注冊(cè)的 App IDs。App ID 被配置到【XcodeTarget|Info|Bundle Identifier】下;對(duì)于 Wildcard App ID,只要 bundle identifier 包含其作為 Prefix/Seed 即可。

.設(shè)備(Device)

Device 就是運(yùn)行 iOS 系統(tǒng)用于開發(fā)調(diào)試 App 的設(shè)備。每臺(tái) Apple 設(shè)備使用 UDID (Unique Device Identifier)來(lái)唯一標(biāo)識(shí)。

iOS 設(shè)備連接 Mac 后,可通過(guò) iTunes->Summary 或者 Xcode->Window->Devices 查看其UDID。

Apple Member Center 網(wǎng)站個(gè)人賬號(hào)下的 Devices 中包含了注冊(cè)過(guò)的所有可用于開發(fā)和測(cè)試的設(shè)備,普通個(gè)人開發(fā)賬號(hào)每年累計(jì)最多只能注冊(cè)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)站上注冊(cè)或啟用/禁用(Enable/Disable)已注冊(cè)的Device。本文的 Devices 是指連接到 Xcode 被授權(quán)用于開發(fā)測(cè)試的iOS設(shè)備(iPhone/iPad)。

.開發(fā)證書(Certificates)

1.證書的概念

證書是由公證處或認(rèn)證機(jī)關(guān)開具的證明資格或權(quán)力的證件,它是表明(或幫助斷定)事理的一個(gè)憑證。證件或憑證的尾部通常會(huì)烙印公章

每個(gè)中國(guó)人一生可能需要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)(CA = Certificate Authority),又稱為數(shù)字證書授權(quán)中心(數(shù)字證書認(rèn)證機(jī)構(gòu))頒發(fā)(發(fā)行)的,人們可以在網(wǎng)上用它來(lái)識(shí)別對(duì)方的身份。數(shù)字證書是一個(gè)經(jīng) CA 數(shù)字簽名的包含公開密鑰擁有者信息以及公開密鑰的文件。最簡(jiǎn)單的證書包含一個(gè)公開密鑰、名稱以及 CA 的數(shù)字簽名。數(shù)字證書還有一個(gè)重要的特征就是時(shí)效性:只在特定的時(shí)間段內(nèi)有效。

數(shù)字證書中的公開密鑰(公鑰)相當(dāng)于公章。

證書的信任鏈條是環(huán)環(huán)相扣的,根證書就是一開始就被信任的證書,是信任鏈的起始點(diǎn)

在天朝子民的一生中,戶籍證明可理解為等效的根證書:有了戶籍證明,才能辦理身份證;有了上流的身份證,才能辦理下游居住證、結(jié)婚證、計(jì)劃生育證、駕駛執(zhí)照等認(rèn)證。

3.根證書的概念

根證書是被嚴(yán)格限制和確認(rèn)的,根證書的頒發(fā)者被稱之為 Root Certificate Authority(Root CA)。

某一認(rèn)證領(lǐng)域內(nèi)的根證書是 CA 認(rèn)證中心給自己頒發(fā)的證書(自行簽名),安裝根證書意味著對(duì)這個(gè) CA 認(rèn)證中心的信任。

那么由誰(shuí)來(lái)保證信任鏈起點(diǎn)的安全呢?

現(xiàn)代網(wǎng)絡(luò)操作系統(tǒng)都會(huì)內(nèi)置一份可信的根證書列表(Firefox 的根證書列表獨(dú)立于操作系統(tǒng)之外)。

所謂“可信的根證書列表”是指操作系統(tǒng)開發(fā)商通過(guò)嚴(yán)格地審核,將安全可靠、可被信任的 CA 機(jī)構(gòu)納入白名單,并將這些權(quán)威可信 CA 的根證書預(yù)安裝到操作系統(tǒng)中。

》在 Windows Internet Explorer 中,通過(guò)菜單【工具 | Internet 選項(xiàng) | 內(nèi)容 | 證書】可以查看受信任的根證書頒發(fā)機(jī)構(gòu)(或中間證書頒發(fā)機(jī)構(gòu)):

》在 macOS Keychain Access 中,可查看系統(tǒng)根證書(或系統(tǒng)證書):

常見(jiàn)的權(quán)威 CA 根證書有

AddTrust External CA Root(The USERTrust Network?)Baltimore CyberTrust Root(DigiCert Baltimore Root)DigiCert Global Root CA(DigiCert)DigiCert High Assurance EV Root CA(DigiCert)DST Root CA X3GeoTrust Global CAGeoTrust Primary Certification AuthorityGlobalSign(頒發(fā)者:GlobalSign Root CA - R3;簽名算法:sha256RSA——帶 RSA 加密的 SHA-256)GlobalSign(頒發(fā)者:GlobalSign Root CA - R2;簽名算法:sha1RSA——帶 RSA 加密的 SHA-1)GlobalSign Root CA(組織:GlobalSign nv-sa)Go Daddy Class 2 Certification Authority(組織:The Go Daddy Group, Inc.)Go Daddy Root Certificate Authority - G2(組織:GoDaddy.com, Inc.)QuoVadis Root Certification Authority(組織:QuoVadis Limited)Starfield Class 2 Certification AuthorityStarfield Services Root Certificate Authority( - G2)(組織:Starfield Technologies, Inc.)StartCom Certification Authority(簽名算法:sha1RSA——帶 RSA 加密的 SHA-1)thawte Primary Root CAthawte Primary Root CA - G3UTN-USERFirst-Object(組織:The USERTRUST Network)VeriSign Universal Root Certification Authority(組織單位:VeriSign Trust Network)VeriSign Class 3 Public Primary Certification Authority - G5(組織單位:VeriSign Trust Network)

--------------------------------------------------------------------------------Windows 下微軟頒發(fā)的證書:--------------------------------------------------------------------------------

Microsoft Root AuthorityMicrosoft Root Certificate AuthoritySymantec Enterprise Mobile Root for Microsoft--------------------------------------------------------------------------------macOS 下蘋果頒發(fā)的證書:--------------------------------------------------------------------------------Apple Root CAApple Root Certificate Authority    Developer ID Certification Authority(系統(tǒng)根證書)    Apple Worldwide Developer Relations Certification Authority(系統(tǒng)證書)橢圓曲線公共密鑰:簽名算法:帶 SHA-256 的 ECDSA 簽名;公共密鑰算法:橢圓曲線公共密鑰;參數(shù)為[橢圓曲線 secp256r1]簽名算法:帶 SHA-384 的 ECDSA 簽名;公共密鑰算法:橢圓曲線公共密鑰;參數(shù)為[橢圓曲線 secp384r1]macOS 預(yù)裝了 Apple Root CA、GlobalSign、GeoTrust、Symantec、thawte、VeriSign 等權(quán)威機(jī)構(gòu)的包含橢圓曲線公共密鑰的根證書:GlobalSign(組織單位:GlobalSign ECC Root CA - R4;帶 SHA-256 的 ECDSA 簽名)GlobalSign(組織單位:GlobalSign ECC Root CA - R5;帶 SHA-384 的 ECDSA 簽名)Apple Root CA - G3(組織單位:Apple Certification Authority;帶 SHA-384 的 ECDSA 簽名)GeoTrust Primary Certification Authority - G2(組織:GeoTrust Inc.;帶 SHA-384 的 ECDSA 簽名)Symantec Class 1/2/3 Public Primary Certification Authority - G4(組織單位:Symantec Trust Network;帶 SHA-384 的 ECDSA 簽名)thawte Primary Root CA - G2(組織:thawte, Inc.;帶 SHA-384 的 ECDSA 簽名)VeriSign Class 3 Public Primary Certification Authority - G4(組織單位:VeriSign Trust Network;帶 SHA-384 的 ECDSA 簽名)

為了防止 GFW 進(jìn)行中間人攻擊(MitM),例如篡改 github 證書,導(dǎo)致無(wú)法訪問(wèn) github 網(wǎng)站等問(wèn)題,可選擇不信任 CNNIC:

在[鑰匙串-系統(tǒng)]中雙擊 CNNIC ROOT,在【信任】|【使用此證書時(shí)】下拉選擇【永不信任】。

4.iOS(開發(fā))證書

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

iOS 證書分為兩類:Development 和 Production(Distribution)。

Development 證書用來(lái)開發(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 主要用來(lái)分發(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ā)賬號(hào)最多可注冊(cè) iOS Development/Distribution 證書各2個(gè),用戶可在網(wǎng)站上刪除(Revoke)已注冊(cè)的 Certificate。

下文主要針對(duì) iOS App 開發(fā)調(diào)試過(guò)程中的開發(fā)證書(Certificate for Development)。

5.iOS(開發(fā))證書的根證書

那么,iOS 開發(fā)證書是誰(shuí)頒發(fā)的呢?或者說(shuō)我們是從哪個(gè) CA 申請(qǐng)到用于 Xcode 開發(fā)調(diào)試 App 的證書呢?

iOS 以及 Mac OS X 系統(tǒng)(在安裝 Xcode 時(shí))將自動(dòng)安裝 AppleWWDRCA.cer 這個(gè)中間證書(Intermediate Certificates),它實(shí)際上就是 iOS(開發(fā))證書的證書,即開發(fā)根證書

AppleWWDRCA.cer 是由蘋果公司一級(jí)認(rèn)證中心 Apple Certification Authority(Apple Root CA)給下屬的二級(jí)證書機(jī)構(gòu) Apple Worldwide Developer Relations Certification Authority 頒發(fā)的證書。而蘋果根證書則是被默認(rèn)預(yù)裝到 macOS 系統(tǒng)中的,在 Keychain Access 系統(tǒng)根證書中可以找到 Apple Root CA 為自己頒發(fā)的根證書。

Apple Root CA 之于  Apple Certification Authority 好比戶籍證之于身份證;AppleWWDRCA.cer 之于 iOS(開發(fā))證書則好比身份證之于駕駛證

如果 Mac Keychain Access 證書助理在申請(qǐng)證書時(shí)尚未安裝過(guò)該證書,請(qǐng)先下載安裝(Signing requires that you have both the signing identity and the intermediate certificate installed in your keychain)。

下載到本地后,手動(dòng)點(diǎn)擊 *.cer 安裝證書到 macOS 時(shí),Keychain Access 追溯其簽發(fā) CA 為 Apple Root CA,利用 Apple Root CA 證書公鑰對(duì)其數(shù)字簽名進(jìn)行解密和校驗(yàn)。校驗(yàn)成功會(huì)標(biāo)記此證書有效(This certificate is valid)。

二級(jí)證書路徑為:

Apple Root CA└── Apple Worldwide Developer Relations Certification Authority

6.申請(qǐng)證書(CSR:Certificate Signing Request)

可以在缺少證書時(shí)通過(guò) Xcode Fix Issue 自動(dòng)請(qǐng)求證書,但是這會(huì)掩蓋其中的具體流程細(xì)節(jié)。這里通過(guò) Keychain 證書助理從證書頒發(fā)機(jī)構(gòu)請(qǐng)求證書:填寫開發(fā)賬號(hào)郵件和常用名稱,勾選【存儲(chǔ)到磁盤】。

Keychain Access|Keys 中將新增一對(duì)非對(duì)稱密鑰對(duì) Public/Private Key Pair(This signing identity consists of a public-private key pair that Apple issues)。同時(shí),keychain 將生成一個(gè)包含開發(fā)者身份信息和公鑰的CSR(Certificate Signing Request)文件——CertificateSigningRequest.certSigningRequest。

私鑰 private key 始終保存在 Mac OS 的 Keychain Access 中,用于簽名(CodeSign)本機(jī)對(duì)外發(fā)布的 App;公鑰 public key 一般隨證書(隨Provisioning Profile,隨 App 安裝)散布出去,對(duì) App 簽名進(jìn)行校驗(yàn)認(rèn)證。用戶必須妥善保存本地 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),有點(diǎn)類似為github賬號(hào)添加SSH公鑰到服務(wù)器上進(jìn)行授權(quán)。

Apple Developer 開發(fā)證書頒發(fā)機(jī)構(gòu) WWDRCA 將使用其 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)同步證書和[生成]配置文件)。

手動(dòng)點(diǎn)擊 *.cer 安裝證書到 macOS 時(shí),Keychain Access 追溯其簽發(fā) CA 為AppleWWDRCA(Apple Worldwide Developer Relations Certification Authority),利用AppleWWDRCA 證書公鑰對(duì)該開發(fā)證書數(shù)字簽名進(jìn)行解密和校驗(yàn)。校驗(yàn)成功會(huì)標(biāo)記此證書有效(This certificate is valid)。

三級(jí)開發(fā)證書路徑為:

Apple Root CA└── Apple Worldwide Developer Relations Certification Authority    └── iPhone Developer: *@Gmail.com (**********)

在 Keychain Access 的 Login | My Certificates 可查看到安裝成功的證書。

在 Keychain Access 的 Login | Keys 中展開創(chuàng)建 CSR 時(shí)生成的 Key Pair 中的私鑰前面的箭頭,可以查看到包含其對(duì)應(yīng)公鑰的證書(Your requested certificate will be the public half of the key pair.);在 Keychain Access|Certificates 中展開安裝的證書(ios_development.cer)前面的箭頭,可以看到其對(duì)應(yīng)的私鑰。

Certificate 應(yīng)被配置到【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è)備 ID

一個(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。

Provisioning Profile 把這些信息全部打包在一起,方便我們?cè)谡{(diào)試和發(fā)布程序打包時(shí)使用。這樣,只要在不同的情況下選擇不同的 Provisioning Profile 文件就可以了。

Provisioning Profile 也分為 Development 和 Distribution 兩類,有效期同 Certificate 一樣。Distribution 版本的 ProvisioningProfile 主要用于提交 App Store 審核,其中不指定開發(fā)測(cè)試的Devices(0,unlimited)。App ID 為 Wildcard App ID(*)。App Store 審核通過(guò)上架后,允許所有 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)成簡(jiǎn)析

(1)Name:該mobileprovision的文件名。

(2)UUID:該mobileprovision文件的真實(shí)文件名。

(3)TeamName:Apple ID賬號(hào)名。

(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 來(lái)處理(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 查看對(duì)應(yīng)證書 ios_development.cer,正常情況(公私鑰 KeyPair 配對(duì))應(yīng)吻合;Windows 下沒(méi)有足夠信息(WWDRCA.cer),無(wú)法驗(yàn)證該證書。

如果你用了一個(gè)不在這個(gè)列表中的證書進(jìn)行簽名,無(wú)論這個(gè)證書是否有效,這個(gè)應(yīng)用都將 CodeSign Fail。

(8)Entitlements 鍵<key>對(duì)應(yīng)的<dict>:

keychain-access-groups:$(AppIdentifierPrefix),參見(jiàn)Code Signing Entitlements(*.entitlements)。

每個(gè)應(yīng)用程序都有一個(gè)可以用于安全保存一些如密碼、認(rèn)證等信息的 keychain,一般而言自己的程序只能訪問(wèn)自己的 keychain。通過(guò)對(duì)應(yīng)用簽名時(shí)的一些設(shè)置,還可以利用keychain的方式實(shí)現(xiàn)同一開發(fā)者簽證(就是相同bundle seed)下的不同應(yīng)用之間共享信息的操作。比如你有一個(gè)開發(fā)者帳戶,并開發(fā)了兩個(gè)不同的應(yīng)用A和B,然后通過(guò)對(duì)A和B的 keychain access group 這個(gè)東西指定共用的訪問(wèn)分組,就可以實(shí)現(xiàn)共享此 keychain 中的內(nèi)容。

application-identifier:帶前綴的全名,例如$(AppIdentifierPrefix)com.apple.garageband。

com.apple.security.application-groups:App Group ID(group. com.apple),參見(jiàn)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ā)者賬號(hào)都對(duì)應(yīng)一個(gè)唯一的 Team ID,Xcode3.2.3 預(yù)發(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。

2.Team Provisioning Profile 生成/更新時(shí)機(jī)

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 來(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】下,同時(shí)需要在【XcodeTarget|General|Identity】下指定 Team 賬號(hào) ID。

.App Group (ID)

1.App Group 的概念

WWDC14 除了發(fā)布了 OS X v10.10 和 switf 外,iOS 8.0 也開始變得更加開放了。說(shuō)到開放,當(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è)輕量級(jí)(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ù)共享,具體來(lái)說(shuō)是通過(guò)創(chuàng)建使用以 App Group ID 標(biāo)識(shí)的共享資源區(qū)——App GroupContainer 來(lái)實(shí)現(xiàn)的。

App Group ID 同 App ID 一樣,一般不超過(guò)255個(gè)ASCII字符。用戶可在網(wǎng)站上編輯 Explicit App IDs,將其納入 App Group(Assignment);也可刪除(Delete)已注冊(cè)的App Group (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”,則支持從語(yǔ)音備忘錄導(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ā)測(cè)試設(shè)備的UDIDs

GarageBand擴(kuò)展插件

com.apple.garageband.extImportRecording

關(guān)于Provisioning Profile,可以使用自己手動(dòng)生成的,也可以使用 Xcode 自動(dòng)生成的 Team Provisioning Profile。

App Group 會(huì)被配置到【Xcode Target|Build Settings|Code Signing|Code Signing Entitlements】文件(*.entitlements)的鍵com.apple.security.application-groups下,不影響 Provisioning Profile 生成流程。

.證書與簽名(Certificate& Signature)

1.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 頒布,即證書來(lái)源可信;再對(duì)證書本身使用哈希算法計(jì)算摘要,若與上一步得到的摘要一致,則證明此證書未被篡改過(guò),即證書完整。

2.Code Signing

每個(gè)證書(其實(shí)是公鑰)對(duì)應(yīng) Key Pair 中的私鑰會(huì)被用來(lái)對(duì)內(nèi)容(executable code,resources such as images and nib files aren’t signed)進(jìn)行數(shù)字簽名(CodeSign)——使用哈希算法生成內(nèi)容摘要(digest)。

Xcode 使用指定證書配套的私鑰進(jìn)行簽名時(shí)需要授權(quán),選擇【始終允許】后,以后使用該私鑰進(jìn)行簽名便不會(huì)再?gòu)棾鍪跈?quán)確認(rèn)窗口。

3.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 bundle)的內(nèi)容摘要(_CodeSignature),證明此 App 確乃認(rèn)證開發(fā)者發(fā)布,即來(lái)源可信;再對(duì) App(executable bundle)本身使用哈希算法計(jì)算摘要,若與上一步得到的摘要一致,則證明此 App 未被篡改過(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)之列。無(wú)論是 Xcode 對(duì) APP 進(jìn)行簽名打包還是真機(jī)運(yùn)行 APP 進(jìn)行校驗(yàn),都使用了非對(duì)稱加密機(jī)制(Apple Root CA - G3 根證書定義了 帶 SHA-384 ECDSA 簽名的橢圓曲線 ECC 公共密鑰)。

.在多臺(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 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 同步該賬號(hào)下所有的 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 或者通過(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)試。

九.證書配置常見(jiàn)錯(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配置是否正確。如果是別人提供的共享賬號(hào)(*.developerprofile)或共享證書(*.p12),請(qǐng)確保導(dǎo)出了對(duì)應(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)檢查對(duì)應(yīng)版本(Debug)指定的*.entitlements文件中的“Keychain Access Groups”鍵值是否與ProvisioningProfile中的Entitlements項(xiàng)相吻合(后者一般為前者的Prefix/Seed)。

(2)也可以將Build Settings|Code Signing的Provisioning Profile中對(duì)應(yīng)版本(Debug)的Entitlements置空。

4.The app ID cannot be registered to your development team

出現(xiàn)該問(wèn)題通常是 app ID 沖突,即該 app ID 已經(jīng)有人注冊(cè)過(guò),此時(shí)可以按照提示換一個(gè) app ID或基于已有app ID添加后綴——Change your bundle identifier to a unique string to try again。

5.The 'In-App Purchase' feature is only available to users enrolled in Apple Developer Program

只有開發(fā)者賬號(hào)才能真機(jī)調(diào)試 'In-App Purchase' 特性,所以需要在工程配置(Capabilities)中禁用普通Apple ID不支持的特性。

同樣,在 Xcode 8 中,也只有開發(fā)者賬號(hào)才能真機(jī)調(diào)試The 'Siri' feature,否則也會(huì)報(bào)錯(cuò)“The 'Siri' feature is only available to users enrolled in Apple Developer Program.”而無(wú)法完成簽名認(rèn)證。

解決方法

在Xcode的 Project Navigator 中點(diǎn)擊*.xcodeproj ,在右側(cè)的 Targets 下選擇點(diǎn)擊目標(biāo) Target,在【Capabilities】中禁用“Push Notifications”、“In-App Purchase”、“Siri”。

如果找不到這些配置項(xiàng),可嘗試直接修改項(xiàng)目配置文件中相應(yīng)feature的配置開關(guān),步驟如下:

關(guān)閉 Xcode 正在打開的 Project,在 Finder 中右鍵項(xiàng)目配置文件 *.xcodeproj 顯示包內(nèi)容,使用文本編輯器(例如 Sublime Text)打開 project.pbxproj 文件,搜索“SystemCapabilities”,依次找到“com.apple.Push”、“com.apple.InAppPurchase”、“com.apple.Siri”將其 enabled 鍵值從1修改為0,關(guān)閉退出使用 Xcode 重新打開該項(xiàng)目。

6.Xcode配置反應(yīng)有時(shí)候不那么及時(shí),可刷新、重置相關(guān)配置項(xiàng)開關(guān)(若有)或重啟Xcode試試。

十. Xcode7+ 免證書真機(jī)調(diào)試

在 Xcode 7 中,蘋果改變了自己在許可權(quán)限上的策略:

此前 Xcode 只開放給注冊(cè)開發(fā)者下載,現(xiàn)在 Xcode 7 改變了這種慣有的做法,無(wú)需注冊(cè)開發(fā)者賬號(hào),僅使用普通的Apple ID就能下載和上手體驗(yàn)。此前開發(fā)者需每年支付99美元的費(fèi)用成為注冊(cè)開發(fā)者才能在 iPhone/iPad 真機(jī)上運(yùn)行調(diào)試APP,蘋果新的開發(fā)者計(jì)劃則放寬要求,無(wú)需購(gòu)買,只要你感興趣同樣可以在設(shè)備上測(cè)試app。——Developers would be able to test apps on devices without a paid Apple developer account in Xcode 7.

所謂“免證書”真機(jī)調(diào)試,并不是真的不需要證書,Xcode真機(jī)調(diào)試原有的證書配置體系仍在——All iOS, tvOS, and watchOS appsmust be code signed and provisioned to launch on a device. 所以,上文啰嗦幾千字還是有點(diǎn)用的。

自 Xcode7 開始,原來(lái)基于付費(fèi)開發(fā)者賬號(hào)及自助生成證書及配置文件的繁瑣過(guò)程被蘋果簡(jiǎn)化,Xcode將針對(duì)任何普通賬號(hào)自動(dòng)為聯(lián)調(diào)真機(jī)生成所需相關(guān)的證書及配置文件。當(dāng)你打算向 App Store 提交發(fā)布應(yīng)用,才需要付費(fèi)。

第一步:進(jìn)入 Xcode Preferences|Accounts,添加自己的 Apple ID 賬號(hào)。

第二步:Build Settings|Code Signing 下的 Provisioning Profile 選擇 Automatic,Code Signing Identity 選擇 Automatic 下的iOS Developer

第三步:General 配置 Bundle identifier,Team 下拉選擇蘋果Member Center自動(dòng)為你的賬號(hào)生成的Personal Team ID。

自己的賬號(hào)在調(diào)試公司或其他第三方APP代碼時(shí),若填寫 Bundle identifier 為他人賬號(hào)注冊(cè)的 APP ID(例如蘋果相機(jī)應(yīng)用 com.apple.camera),會(huì)報(bào)錯(cuò):

[plain] view plain copy print?No provisioning profiles with a valid signing identity (i.e. certificate and private key pair) matching the bundle identifier “com.apple.camera” were found.  

即使編譯通過(guò)了,可能運(yùn)行時(shí)APP自身與服務(wù)器校驗(yàn)也可能會(huì)報(bào)簽名錯(cuò)誤,腫么辦???

Her skill:此時(shí),可以在他人原有App ID基礎(chǔ)上添加后綴(例如com.apple.camera.extension),配置成應(yīng)用的衍生插件(相當(dāng)于置于同一 App Group 下)就可以快樂(lè)的玩耍了。

解決了所有的開發(fā)配置問(wèn)題,Xcode 8 Automatically manage signing 配置成功應(yīng)該是這樣子的:

如果啟動(dòng)APP時(shí),Xcode報(bào)錯(cuò)“process launch failed: Security”或iPhone報(bào)錯(cuò)【不受信任的開發(fā)者】。

此時(shí)需要到iPhone通用配置中的描述文件(最新系統(tǒng)中可能叫設(shè)備管理)中,在描述文件(開發(fā)商應(yīng)用)中選擇對(duì)應(yīng)的描述文件(你的Apple ID)點(diǎn)擊 信任 或 驗(yàn)證 即可。

OK,All Done!

參考:

《iPhone真機(jī)調(diào)試應(yīng)用程序》《iOS Developer:真機(jī)測(cè)試》《Xcode5 & iOS 7 及以下版本免證書真機(jī)調(diào)試記錄》

《iOS Development--Certificates, Provisioning Profiles》《關(guān)于Certificate、Provisioning Profile、App ID的介紹及其關(guān)系》

《數(shù)字簽名和數(shù)字證書》《iOS keyChain 研究》

《蘋果開發(fā)者賬號(hào)那些事兒》《iOS關(guān)於Provisioning Profiles這些事》

《iOS Code Signing 學(xué)習(xí)筆記》《代碼簽名探析/Inside Code Signing》

《iOS Code Signing: 解惑/iOS Code Signing: Under The Hood》

《iOS行貨自動(dòng)打包》《解決Xcode無(wú)法生成Archive的問(wèn)題》《iOS程序完成后如何生成ipa進(jìn)行真機(jī)測(cè)試》

《發(fā)布iOS應(yīng)用程序(Application Loader)》《iOS發(fā)布遇到的一些問(wèn)題》

《Xcode打包ipa包》《iOS程序生成ipa進(jìn)行真機(jī)測(cè)試》


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 神木县| 九江县| 阳江市| 和硕县| 阿勒泰市| 盐边县| 高碑店市| 泰顺县| 西峡县| 云阳县| 小金县| 舟山市| 洪江市| 定安县| 蒙山县| 当阳市| 杨浦区| 霍林郭勒市| 平和县| 建德市| 广丰县| 萍乡市| 亚东县| 舒城县| 木里| 昆山市| 德阳市| 昭苏县| 黄冈市| 德庆县| 彭阳县| 富平县| 江华| 屏边| 沛县| 罗平县| 望城县| 勃利县| 清涧县| 新平| 康保县|