iOS 开发者证书的底层原理
??在日常iOS開(kāi)發(fā)中,都會(huì)遇到各種的證書(shū)、簽名有關(guān)的問(wèn)題。如果你只是一個(gè)人開(kāi)發(fā),你擁有開(kāi)發(fā)者最高權(quán)限,參考網(wǎng)上的教程可以輕松的解決證書(shū)、簽證等問(wèn)題開(kāi)發(fā);但是如果你是在一個(gè)Team中,簽名、證書(shū)就會(huì)出現(xiàn)各種各樣的問(wèn)題,影響你的調(diào)試、打包和上傳,而開(kāi)發(fā)者證書(shū)的底層原理你花一些時(shí)間去深入的理解,讓你在遇到證書(shū)相關(guān)的問(wèn)題游刃有余。
一、基本概念
??在計(jì)算機(jī)世界里Apple開(kāi)發(fā)者證書(shū)并不是獨(dú)立于任何系統(tǒng)單獨(dú)存在的,而是由證書(shū)頒發(fā)機(jī)構(gòu)(CA,Certificate Authority)即頒發(fā)數(shù)字證書(shū)的機(jī)構(gòu)認(rèn)證的一個(gè)證書(shū)頒發(fā)機(jī)構(gòu)。
??CA中心為每個(gè)使用公開(kāi)密鑰的用戶發(fā)放一個(gè)數(shù)字證書(shū),數(shù)字證書(shū)的作用是證明證書(shū)中列出的用戶合法擁有證書(shū)中列出的公開(kāi)密鑰。CA機(jī)構(gòu)的數(shù)字簽名使得攻擊者不能偽造和篡改證書(shū)。在SET交易中,CA不僅對(duì)持卡人、商戶發(fā)放證書(shū),還要對(duì)獲款的銀行、網(wǎng)關(guān)發(fā)放證書(shū)。
??證書(shū)實(shí)際是由證書(shū)簽證機(jī)關(guān)(CA)簽發(fā)的對(duì)用戶的公鑰的認(rèn)證。證書(shū)的內(nèi)容包括:電子簽證機(jī)關(guān)的信息、公鑰用戶信息、公鑰、權(quán)威機(jī)構(gòu)的簽字和有效期等等。
總結(jié)上邊的內(nèi)容,簡(jiǎn)單來(lái)講,證書(shū)底層原理就涉及兩個(gè)關(guān)鍵概念:
- 數(shù)字簽名
- 數(shù)字證書(shū)
數(shù)字簽名
??數(shù)字簽名(又稱公鑰數(shù)字簽名) 是只有信息的發(fā)送者才能產(chǎn)生的別人無(wú)法偽造的一段數(shù)字串,這段數(shù)字串同時(shí)也是對(duì)信息的發(fā)送者發(fā)送信息真實(shí)性的一個(gè)有效證明。
在數(shù)字簽名技術(shù)中,有兩種行為:
- 簽名生成
- 簽名驗(yàn)證
在數(shù)字簽名技術(shù)中,有常用的兩種實(shí)現(xiàn)算法:
1.有哈希算法的數(shù)字簽名與驗(yàn)證
??哈希函數(shù)是一種“壓縮函數(shù)”,利用哈希函數(shù)可以把任意長(zhǎng)度的輸入經(jīng)由散列函數(shù)算法變換成固定長(zhǎng)度的輸出,該輸出的哈希值就是消息摘要,也稱數(shù)字摘要。在正式的數(shù)字簽名中,發(fā)送方首先對(duì)發(fā)送文件采用哈希算法,得到一個(gè)固定長(zhǎng)度的消息摘要( Message Digest);再用自己的私鑰( Secret key,SK)對(duì)消息摘要進(jìn)行簽名,形成發(fā)送方的數(shù)字簽名。數(shù)字簽名將作為隊(duì)件和原文一起發(fā)送給接收方;接收方首先用發(fā)送方的公鑰對(duì)數(shù)字簽名進(jìn)行解密得到發(fā)送方的數(shù)字摘要,然后用相同的哈希函數(shù)對(duì)原文進(jìn)行哈希計(jì)算,得到一個(gè)新的消息摘要,最后將消息摘要與收到的消息摘要做比較。
2.基于非對(duì)稱密鑰加密體制的數(shù)字簽名與驗(yàn)證
??發(fā)送方首先將原文用自己的私鑰加密得到數(shù)字簽名,然后將原文和數(shù)字簽名一起發(fā)送給接收方。接收方用發(fā)送方的公鑰對(duì)數(shù)字簽名進(jìn)行解密,最后與原文進(jìn)行比較,數(shù)字簽名采用了規(guī)范化的程序和科學(xué)化的方法,用于鑒定簽名人的身份以及對(duì)一項(xiàng)電子數(shù)據(jù)內(nèi)容的認(rèn)可。使用數(shù)字簽名技術(shù)能夠驗(yàn)證文件的原文在傳輸過(guò)程中有無(wú)變動(dòng),確保傳輸電子文件的完整性、真實(shí)性和不可抵賴性。

數(shù)字證書(shū)
數(shù)字證書(shū)(Digital Certificate) 是一種相當(dāng)于現(xiàn)實(shí)世界中身份證的功能在數(shù)字信息領(lǐng)域中的實(shí)現(xiàn)。數(shù)字證書(shū)包含了個(gè)人或機(jī)構(gòu)的 身份信息 及其 公鑰,因此也稱為 公鑰證書(shū)(Public-Key Certificate,PKC)。
首先去KeyChain(鑰匙串訪問(wèn)),查看一下安裝的開(kāi)發(fā)者證書(shū)的信息。
根據(jù)證書(shū)頒發(fā)的機(jī)構(gòu)Apple Worldwide Developer Relations Certification Authority在鑰匙串中找到證書(shū)如下的證書(shū)關(guān)系:
??根證書(shū) Apple Root Certificate Authority 是在 MacOS 操作系統(tǒng)安裝時(shí)內(nèi)置的,是 Apple Root CA 自行頒發(fā)的。
??中間證書(shū) Apple World Developer Relations Certificate Authority (實(shí)際文件為 AppleWWDRCA.cer)是在Xcode 安裝時(shí)內(nèi)置的,是 Apple Root CA 頒發(fā)的。雖然 AppleWWDRCA.cer 是中間證書(shū),但是對(duì)于 iOS 開(kāi)發(fā)分類來(lái)說(shuō),它就是 開(kāi)發(fā)根證書(shū)。
Mac電腦上開(kāi)發(fā)者的證書(shū)的關(guān)系:
- Apple Root CA(Apple Certification Authority):根證書(shū)
- Apple Worldwide Developer Relations Certification Authority:中間證書(shū)
- iPhone Developer: Jack Wangle(XXXXXXX):子證書(shū)
- Apple Worldwide Developer Relations Certification Authority:中間證書(shū)
二、Certificates 的申請(qǐng)
Certificate是用來(lái)給應(yīng)用程序簽名的,只有經(jīng)過(guò)簽名的應(yīng)用程序才能保證他的來(lái)源是可信任的,并且代碼是完整的、未經(jīng)修改的。證書(shū)的后綴為.cer
在我們申請(qǐng)證書(shū)前,需要先申請(qǐng)一個(gè)CSR(即Certificate Signing Request)文件,此過(guò)程實(shí)際上是生成一對(duì)密鑰(即公鑰和私鑰),這對(duì)密鑰將保存在開(kāi)發(fā)者M(jìn)ac電腦的Keychain(即鑰匙串訪問(wèn))中,CSR文件中則包含公鑰。具體操作如下:
證書(shū)類型有很多種,這里簡(jiǎn)單介紹一下常見(jiàn)的:
-
iOS App Development(即開(kāi)發(fā)證書(shū)),用于開(kāi)發(fā)和真機(jī)調(diào)試app
-
iOS Distribution (App Store and Ad Hoc)(即分發(fā)證書(shū)),用于蘋(píng)果應(yīng)用市場(chǎng)(App Store)和內(nèi)部分發(fā)渠道(Ad Hoc)
-
APNS(Apple Push Notification Service,即蘋(píng)果推送證書(shū)),用于推送通知到app。
- 與開(kāi)發(fā)證書(shū)和分發(fā)證書(shū)不同的是,APNS與App ID有關(guān)。
- APNS有兩種證書(shū),分別是用于開(kāi)發(fā)環(huán)境的 iOS Apple Push Notification service SSL (Sandbox),以及用于生產(chǎn)環(huán)境的 Apple Push Notification service SSL (Sandbox & Production)。如果你的app有推送服務(wù),這兩種推送證書(shū)都是需要?jiǎng)?chuàng)建的
1.打開(kāi)KeyChain(鑰匙串訪問(wèn))—>證書(shū)助手---->從證書(shū)頒發(fā)機(jī)構(gòu)請(qǐng)求證書(shū)…
2.保存從CA請(qǐng)求的證書(shū)(CSR文件)
2.1保存到本地的證書(shū)文件(CSR文件)
2.2從KeyChain中可以生成的一對(duì)private Key 和 Public Key
3.創(chuàng)建開(kāi)發(fā)者證書(shū),上傳需要的CSR文件,由Apple CA進(jìn)行簽名生成開(kāi)發(fā)者證書(shū)。
4.下載生成的證書(shū)到Mac本地,雙擊安裝即可。
介紹:
p12文件
p12文件更確切的說(shuō):p12證書(shū),因?yàn)槠浔旧砭褪且粋€(gè)加密的證書(shū),后綴為.p12。開(kāi)發(fā)者將CSR文件發(fā)給蘋(píng)果服務(wù)器,由此蘋(píng)果服務(wù)器會(huì)生成Certificate文件(含公鑰),接著開(kāi)發(fā)者將其下載到本地,再導(dǎo)入鑰匙串中后,就可以從鑰匙串中導(dǎo)出p12證書(shū)。顯然,p12文件里面有匹配的公鑰和私鑰。
三、創(chuàng)建 Identifiers & Device & Profiles
1.Identifiers創(chuàng)建App ID
App ID用于標(biāo)識(shí)一個(gè)或者一組App。主要有兩種:
- Explicit App ID:是app的唯一標(biāo)識(shí)符,它由蘋(píng)果為開(kāi)發(fā)者創(chuàng)建的team id和app的bundle id組成。每個(gè)app都會(huì)有且僅有一個(gè)明確的Explicit App ID。
- Wildcard App ID:即通配符App ID,用于標(biāo)識(shí)一組app,以*結(jié)束,如com.company.*標(biāo)識(shí)以com.company開(kāi)頭的所有應(yīng)用程序。
2.Device創(chuàng)建
Devices中包含了蘋(píng)果開(kāi)發(fā)者賬號(hào)中所有可用于開(kāi)發(fā)和測(cè)試的設(shè)備,每臺(tái)設(shè)備使用UDID來(lái)唯一標(biāo)識(shí)。
3.Provisioning Profile(描述文件)創(chuàng)建
一個(gè)描述文件包含了App ID、Certificate、Device,其后綴為.mobileprovision。常用的有:
- iOS App Development,用于開(kāi)發(fā)時(shí)的真機(jī)調(diào)試,包含App ID、證書(shū)和設(shè)備
- Ad Hoc,用于分發(fā)時(shí)的真機(jī)調(diào)試,同樣包含App ID、證書(shū)和設(shè)備
- App Store,用于分發(fā)到蘋(píng)果應(yīng)用市場(chǎng),包含App ID和證書(shū),與設(shè)備無(wú)關(guān),且所有能訪問(wèn)App Store的蘋(píng)果設(shè)備均可下載安裝app。
描述文件的作用主要是:
- 限制只有在蘋(píng)果后臺(tái)注冊(cè)過(guò)的設(shè)備才可以安裝
- 限制簽名只能針對(duì)某一個(gè)具體的App
描述文件中還包含Entitlements(權(quán)限信息),權(quán)限信息指明了app使用的蘋(píng)果服務(wù),如iCloud權(quán)限、推送、蘋(píng)果內(nèi)購(gòu)等。
1.選擇Provisioning Profile的類型
2.Provisioning Profile選擇對(duì)應(yīng)的Identity的Apple ID
3.選擇對(duì)應(yīng)的證書(shū)文件
4.選擇Device設(shè)備
5.填寫(xiě)創(chuàng)建的Provisioning Profile文件的名字
6.下載Profile文件
四、iOS簽名的原理
1.iOS證書(shū)申請(qǐng)的基本原理
- 開(kāi)發(fā)者在本地生成密鑰對(duì),并提供開(kāi)發(fā)者的身份信息。
- 將密鑰對(duì)中的公鑰、身份信息發(fā)送給 CA。
- CA 使用 CA 私鑰對(duì)開(kāi)發(fā)者的公鑰、身份信息進(jìn)行簽名。
- CA 將開(kāi)發(fā)者的公鑰、身份信息、簽名組裝成證書(shū)以供下載。
2.iOS證書(shū)申請(qǐng)的基本原理
解釋說(shuō)明:
- 1.蘋(píng)果官方有多對(duì)密鑰,即私鑰和公鑰
- 2.生成CRS文件時(shí),證書(shū)助手使用Apple Worldwide Developer Relations Certification Authority證書(shū)中的公鑰對(duì)生成的一對(duì)密鑰(公鑰M、私鑰M)中的公鑰M以及對(duì)應(yīng)的電腦上的開(kāi)發(fā)認(rèn)證信息發(fā)送給蘋(píng)果服務(wù)器。(Mac電腦和蘋(píng)果之間存在的一對(duì)鑰匙串在圖上并沒(méi)有顯示)
- 3.創(chuàng)建證書(shū)之前,生成CRS文件是,創(chuàng)建的在Mac電腦上的密鑰(記作:密鑰M:公鑰M、私鑰M)
- 4.蘋(píng)果和IPhone手機(jī)之間存在一對(duì)密鑰(記作:密鑰A:公鑰A、私鑰A)
下方詳細(xì)分析一下iOS的簽名原理(簽名和驗(yàn)證):
1.創(chuàng)建證書(shū)前的準(zhǔn)備工作,首先通過(guò)鑰匙串申請(qǐng)一個(gè)CRS文件,同時(shí)生成一對(duì)非對(duì)稱加密密鑰,也就是如上圖的: 私鑰M 和 公鑰M,會(huì)把公鑰M 和 Mac上的證書(shū)信息(Apple Worldwide Developer Relations Certification Authority)放在CSR文件中
2.上傳CSR文件發(fā)送給蘋(píng)果服務(wù)器,用于申請(qǐng)證書(shū),蘋(píng)果服務(wù)器使用 蘋(píng)果私鑰A 對(duì)接收到的 公鑰M + 信息進(jìn)行簽名。生成Certificate文件(文件后綴名:.cer),并下載到本地安裝。并創(chuàng)建App對(duì)應(yīng)的 Devices 、App ID(包含Entitlements)。
3.在創(chuàng)建 Provisioning Profile 中, Provisioning Profile 分別對(duì)Certificate 、Devices 、App ID(包含Entitlements)一起的數(shù)據(jù)用私鑰A進(jìn)行簽名,生成Provisioning Profile(即描述文件),下載安裝到Mac電腦。
4.iOS項(xiàng)目編譯完之后生成.app文件,在.app文件中含有Provisioning Profile描述文件 (embedded.moblieprovision 描述文件) + 安裝包 + 其他信息。
iOS安裝包 .ipa文件解壓之后的文件目錄:(最終安裝包.app和編譯后的.app一致)
.ipa 解壓之后的文件目錄
XCode先使用私鑰M對(duì).app進(jìn)行簽名,然后,把.app和描述文件一起壓縮成安裝包.ipa文件。是對(duì)資源文件的簽名,生成的簽名文件名為CodeResources,存放在.app目錄下的_CodeSignature文件夾中。
5.XCode準(zhǔn)備把安裝包安裝在蘋(píng)果設(shè)備(如iPhone)上。
6.iPhone對(duì)安裝包進(jìn)行驗(yàn)證,即用 公鑰A 驗(yàn)證描述文件中的簽名。驗(yàn)證通過(guò)則說(shuō)明描述文件里的數(shù)據(jù)是蘋(píng)果授權(quán)的。
7.當(dāng)?shù)凇?】步驗(yàn)證通過(guò)后,再用公鑰A驗(yàn)證證書(shū)中的簽名。驗(yàn)證通過(guò)則說(shuō)明公鑰M是安全可信任的。
8.第【7】步驗(yàn)證通過(guò)后,就可以取出描述文件里的數(shù)據(jù)做各種驗(yàn)證,包括用公鑰M驗(yàn)證App簽名,驗(yàn)證iPhone是否在設(shè)備列表中,App ID是否對(duì)得上,使用的權(quán)限是否跟Entitlements對(duì)應(yīng)等。當(dāng)這些全部驗(yàn)證通過(guò),iPhone就可以安裝app了。
以上就是iOS簽名的流程,分析了蘋(píng)果用了兩對(duì)非對(duì)稱加密密鑰,進(jìn)行的是雙重驗(yàn)證,基本保證了XCode真機(jī)調(diào)試的安全性,確保app的安裝行為是受到蘋(píng)果管控的。
總結(jié)
非對(duì)稱加密貫穿于 iOS 開(kāi)發(fā)之中。當(dāng)我們?cè)陂_(kāi)發(fā)中遇到簽名、證書(shū)相關(guān)的問(wèn)題時(shí),我們只要結(jié)合證書(shū)幕后的原理,很容易就能找到解決辦法。
總結(jié)
以上是生活随笔為你收集整理的iOS 开发者证书的底层原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 利用有限元数值模拟技术辅助静电场学习
- 下一篇: 果壳的“分答”