流程
1.在你的 Mac 開(kāi)發(fā)機(jī)器生成一對(duì)公私鑰较木,這里稱為公鑰L,私鑰L表蝙。L:Local
2.蘋果自己有固定的一對(duì)公私鑰拴测,跟上面 AppStore 例子一樣,私鑰在蘋果后臺(tái)府蛇,公鑰在每個(gè) iOS 設(shè)備上。這里稱為公鑰A屿愚,私鑰A汇跨。A:Apple
3.把公鑰 L 傳到蘋果后臺(tái),用蘋果后臺(tái)里的私鑰 A 去簽名公鑰 L妆距。得到一份數(shù)據(jù)包含了公鑰 L 以及其簽名穷遂,把這份數(shù)據(jù)稱為證書。
4.在蘋果后臺(tái)申請(qǐng) AppID娱据,配置好設(shè)備 ID 列表和 APP 可使用的權(quán)限蚪黑,再加上第③步的證書,組成的數(shù)據(jù)用私鑰 A 簽名,把數(shù)據(jù)和簽名一起組成一個(gè) Provisioning Profile 文件忌穿,下載到本地 Mac 開(kāi)發(fā)機(jī)抒寂。
5.在開(kāi)發(fā)時(shí),編譯完一個(gè) APP 后掠剑,用本地的私鑰 L 對(duì)這個(gè) APP 進(jìn)行簽名屈芜,同時(shí)把第④步得到的 Provisioning Profile 文件打包進(jìn) APP 里,文件名為embedded.mobileprovision朴译,把 APP 安裝到手機(jī)上井佑。
6.在安裝時(shí),iOS 系統(tǒng)取得證書眠寿,通過(guò)系統(tǒng)內(nèi)置的公鑰 A躬翁,去驗(yàn)證embedded.mobileprovision的數(shù)字簽名是否正確,里面的證書簽名也會(huì)再驗(yàn)一遍盯拱。
7.確保了embedded.mobileprovision里的數(shù)據(jù)都是蘋果授權(quán)以后盒发,就可以取出里面的數(shù)據(jù),做各種驗(yàn)證坟乾,包括用公鑰 L 驗(yàn)證APP簽名迹辐,驗(yàn)證設(shè)備 ID 是否在 ID 列表上,AppID 是否對(duì)應(yīng)得上甚侣,權(quán)限開(kāi)關(guān)是否跟 APP 里的 Entitlements 對(duì)應(yīng)等明吩。
開(kāi)發(fā)者證書從簽名到認(rèn)證最終蘋果采用的流程大致是這樣,還有一些細(xì)節(jié)像證書有效期/證書類型等就不細(xì)說(shuō)了殷费。
解釋
上面的步驟對(duì)應(yīng)到我們平常具體的操作和概念是這樣的:
1.第 1 步對(duì)應(yīng)的是 keychain 里的 “從證書頒發(fā)機(jī)構(gòu)請(qǐng)求證書”印荔,這里就本地生成了一堆公私鑰,保存的CertificateSigningRequest就是公鑰详羡,私鑰保存在本地電腦里仍律。
2.第 2 步蘋果處理,不用管实柠。
3.第 3 步對(duì)應(yīng)把CertificateSigningRequest傳到蘋果后臺(tái)生成證書水泉,并下載到本地。這時(shí)本地有兩個(gè)證書窒盐,一個(gè)是第 1 步生成的草则,一個(gè)是這里下載回來(lái)的,keychain 會(huì)把這兩個(gè)證書關(guān)聯(lián)起來(lái)蟹漓,因?yàn)樗麄児借€是對(duì)應(yīng)的炕横,在XCode選擇下載回來(lái)的證書時(shí),實(shí)際上會(huì)找到 keychain 里對(duì)應(yīng)的私鑰去簽名葡粒。這里私鑰只有生成它的這臺(tái) Mac 有份殿,如果別的 Mac 也要編譯簽名這個(gè) App 怎么辦膜钓?答案是把私鑰導(dǎo)出給其他 Mac 用,在 keychain 里導(dǎo)出私鑰卿嘲,就會(huì)存成.p12文件颂斜,其他 Mac 打開(kāi)后就導(dǎo)入了這個(gè)私鑰。
4.第 4 步都是在蘋果網(wǎng)站上操作腔寡,配置 AppID / 權(quán)限 / 設(shè)備等焚鲜,最后下載 Provisioning Profile 文件。
5.第 5 步 XCode 會(huì)通過(guò)第 3 步下載回來(lái)的證書(存著公鑰)放前,在本地找到對(duì)應(yīng)的私鑰(第一步生成的)忿磅,用本地私鑰去簽名 App,并把 Provisioning Profile 文件命名為embedded.mobileprovision一起打包進(jìn)去凭语。這里對(duì) App 的簽名數(shù)據(jù)保存分兩部分葱她,Mach-O 可執(zhí)行文件會(huì)把簽名直接寫入這個(gè)文件里,其他資源文件則會(huì)保存在_CodeSignature目錄下似扔。
第 6 - 7 步的打包和驗(yàn)證都是 Xcode 和 iOS 系統(tǒng)自動(dòng)做的事吨些。
其他
1.證書:內(nèi)容是公鑰或私鑰,由其他機(jī)構(gòu)對(duì)其簽名組成的數(shù)據(jù)包炒辉。
2.Entitlements:包含了 App 權(quán)限開(kāi)關(guān)列表豪墅。
3.CertificateSigningRequest:本地公鑰。
4 p12:本地私鑰黔寇,可以導(dǎo)入到其他電腦偶器。
5.Provisioning Profile:包含了 證書 / Entitlements 等數(shù)據(jù),并由蘋果后臺(tái)私鑰簽名的數(shù)據(jù)包缝裤。