1. 蘋果使用證書的目的是什么
2. AppStore安裝app時(shí)的認(rèn)證流程
3. 開發(fā)者怎么在debug模式下把a(bǔ)pp安裝到設(shè)備呢
一、背景
在 iOS 出來(lái)之前购桑,在主流操作系統(tǒng)(Mac/Windows/Linux)上開發(fā)和運(yùn)行軟件是不需要簽名的,軟件隨便從哪里下載都能運(yùn)行硕噩,導(dǎo)致平臺(tái)對(duì)第三方軟件難以控制榴徐,盜版流行匀归。蘋果希望解決這樣的問(wèn)題耗帕,在 iOS 平臺(tái)對(duì)第三方 APP 有絕對(duì)的控制權(quán)
,一定要保證每一個(gè)安裝到 iOS 上的 APP
都是經(jīng)過(guò)蘋果官方認(rèn)證
的体啰。
1.對(duì)稱加密
對(duì)稱加密
是密碼學(xué)中一類加密算法的統(tǒng)稱嗽仪,這類算法在加密與解密時(shí)使用相同的密鑰
闻坚,或者使用兩個(gè)可以簡(jiǎn)單的相互推算的密鑰。常見(jiàn)的對(duì)稱加密算法有AES仅偎、DES雳殊、3DES夯秃、RC5
等痢艺。相比非對(duì)稱加密算法介陶,對(duì)稱加密算法的優(yōu)點(diǎn)是加解密的速度很快
。
2.非對(duì)稱加密
非對(duì)稱加密
是指加密密鑰與解密密鑰是成對(duì)出現(xiàn)的植酥,其中一個(gè)對(duì)外公開弦牡,叫公鑰
驾锰,另一個(gè)末公開的叫私鑰
,幾乎不能從一個(gè)密鑰計(jì)算出另一個(gè)密鑰耻瑟。通過(guò)私鑰加密的只能通過(guò)公鑰解密赏酥,公鑰加密的只能通過(guò)私鑰解密裸扶。最著名的非對(duì)稱加密算法是RSA
算法。當(dāng)然如此強(qiáng)大可靠的安全性是在犧牲加密速度的基礎(chǔ)上得到的魏保。
3.數(shù)字簽名
通常我們所說(shuō)的簽名就是數(shù)字簽名
谓罗,它是基于非對(duì)稱加密算法
實(shí)現(xiàn)的季二。這里的非對(duì)稱加密就是我們所熟知的RSA
戒傻,要了解RSA背后的數(shù)學(xué)原理可以參考RSA算法原理(一)(二)
- 首先用一種算法需纳,算出原始數(shù)據(jù)的
摘要
。需滿足
a.若原始數(shù)據(jù)有任何變化兵扬,計(jì)算出來(lái)的摘要值都會(huì)變化。
b.摘要要夠短津坑。這里最常用的算法是MD5
疆瑰。 - 生成一份
非對(duì)稱加密
的公鑰和私鑰昙啄,私鑰我自己拿著梳凛,公鑰公布出去。 - 對(duì)一份數(shù)據(jù)淹接,算出
摘要
后叛溢,用私鑰加密
這個(gè)摘要楷掉,得到一份加密后的數(shù)據(jù),稱為原始數(shù)據(jù)的簽名
。把它跟原始數(shù)據(jù)一起發(fā)送給用戶刊橘。 - 用戶收到數(shù)據(jù)和簽名后促绵,用
公鑰解密
得到摘要嘴纺。同時(shí)用戶用同樣的算法計(jì)算原始數(shù)據(jù)的摘要
栽渴,對(duì)比這里計(jì)算出來(lái)的摘要和用公鑰解密簽名得到的摘要是否相等
,若相等則表示這份數(shù)據(jù)中途沒(méi)有被篡改過(guò)慢味,因?yàn)槿绻鄹倪^(guò)纯路,摘要會(huì)變化。
二顶岸、從App Store安裝APP
蘋果官方生成一對(duì)公私鑰辖佣,在iOS
里內(nèi)置一個(gè)公鑰
宵溅,私鑰
由蘋果后臺(tái)
保存恃逻,我們傳 App 上 AppStore 時(shí),蘋果后臺(tái)用私鑰對(duì) APP 數(shù)據(jù)進(jìn)行簽名
凸郑,iOS 系統(tǒng)下載這個(gè) APP 后矛市,用公鑰驗(yàn)證這個(gè)簽名浊吏,若簽名正確,這個(gè) APP 肯定是由蘋果后臺(tái)認(rèn)證的歌憨,并且沒(méi)有被修改過(guò)务嫡,也就達(dá)到了蘋果的需求:保證安裝的每一個(gè) APP 都是經(jīng)過(guò)蘋果官方允許的
三心铃、其他方式安裝APP
-
Debug
開發(fā)App時(shí)可以直接把開發(fā)中的應(yīng)用安裝進(jìn)手機(jī)調(diào)試去扣; -
In-House
企業(yè)內(nèi)部分發(fā)暮顺,可以直接安裝企業(yè)證書簽名后的App; -
AD-Hoc
相當(dāng)于企業(yè)分發(fā)的限制版厅篓,限制安裝設(shè)備數(shù)量秀存,較少用。
image.png
1羽氮、在Mac
上生成一對(duì)公私鑰或链,這里稱公鑰M,私鑰M档押。
2澳盐、蘋果
自己有固定
的一對(duì)公私鑰,跟上面AppStore例子一樣令宿,私鑰在蘋果后臺(tái),公鑰內(nèi)置在每個(gè)iOS設(shè)備上粒没,這里稱為公鑰A筛婉,私鑰A。
3癞松、把公鑰M上傳到蘋果后臺(tái)爽撒,用蘋果后臺(tái)里的私鑰A去簽名公鑰M。得到一份數(shù)據(jù)包含了公鑰M以及其簽名(也就是公鑰的HASH值
)响蓉,把這份數(shù)據(jù)稱為證書
硕勿。
4、在蘋果后臺(tái)申請(qǐng)AppID枫甲,配置好設(shè)備ID列表和APP可使用的權(quán)限源武,再加上第3步的證書,組成的數(shù)據(jù)用私鑰A簽名想幻,把數(shù)據(jù)和簽名一起組成一個(gè)Provisioning Profile
文件粱栖,下載到本地Mac開發(fā)機(jī)。
5脏毯、 在開發(fā)時(shí)查排,編譯完一個(gè)APP后,用本地的私鑰M對(duì)這個(gè)APP進(jìn)行簽名抄沮,同時(shí)把第4步得到的Provisioning Profile
文件打包進(jìn)APP里,文件名為 embedded.mobileprovision
岖瑰,把APP安裝到手機(jī)上叛买。
6、在安裝時(shí)蹋订,iOS系統(tǒng)取得證書率挣,通過(guò)系統(tǒng)內(nèi)置的公鑰A
,去驗(yàn)證證書
的數(shù)字簽名
是否正確露戒。
驗(yàn)證證書確保公鑰M
是蘋果認(rèn)證過(guò)
的椒功,再用公鑰M去驗(yàn)證App的簽名
捶箱,這里就間接驗(yàn)證了這個(gè)App的安裝行為是否經(jīng)過(guò)蘋果官方允許。(這里只驗(yàn)證安裝行為动漾,不驗(yàn)證App是否被改動(dòng)丁屎,因?yàn)殚_發(fā)階段App內(nèi)容總是不斷變化的,蘋果不需要管)旱眯。
上述步驟對(duì)應(yīng)到我們平常具體的操作和概念是這樣的:
第1步
對(duì)應(yīng)的是keychain里的“從證書頒發(fā)機(jī)構(gòu)請(qǐng)求證書”
晨川,這里就本地生成了一對(duì)公私鑰,保存的CertificateSigningRequest
就是公鑰
删豺,私鑰
保存在本地電腦
里共虑。
第2步
蘋果自己處理,我們不用管呀页。
第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打開后就導(dǎo)入私鑰时肿。
第4步
都是在蘋果網(wǎng)站上操作庇茫,配置AppID、權(quán)限螃成、設(shè)備等旦签,最后下載 Provisioning Profile文件筷频。
第5步
Xcode會(huì)通過(guò)第3步下載回來(lái)的證書(存著本地公鑰)识颊,在本地找到對(duì)應(yīng)的私鑰(第1步生成的)手形,用本地私鑰去簽名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)做的事竿秆。
四启摄、總結(jié)
證書
:內(nèi)容是公鑰或私鑰,由其他機(jī)構(gòu)對(duì)其簽名組成的數(shù)據(jù)包幽钢。
Entitlements
:包含了App權(quán)限開關(guān)列表歉备。
CertificateSigningRequest
:本地公鑰。
.p12
:本地私鑰搅吁,可以導(dǎo)入到其他電腦威创。
Provisioning Profile
:包含了 證書/Entitlements 等數(shù)據(jù),并由蘋果后臺(tái)私鑰簽名的數(shù)據(jù)包
其他發(fā)布方式
前面以開發(fā)包為例子說(shuō)了簽名和驗(yàn)證的流程谎懦,另外兩種方式In-House企業(yè)簽名和AD-Hoc流程也是差不多的肚豺,只是企業(yè)簽名不限制安裝的設(shè)備數(shù),另外需要用戶在iOS系統(tǒng)設(shè)置上手動(dòng)點(diǎn)擊信任這個(gè)企業(yè)才能通過(guò)驗(yàn)證界拦。
而AppStore的簽名驗(yàn)證方式有些不一樣吸申,前面我們說(shuō)到最簡(jiǎn)單的簽名方式,蘋果在后臺(tái)直接用私鑰簽名App就可以了享甸,實(shí)際上蘋果確實(shí)是這樣做的截碴,如果去下載一個(gè)AppStore的安裝包
,會(huì)發(fā)現(xiàn)它里面是沒(méi)有embedded.mobileprovision
文件的蛉威,也就是它安裝和啟動(dòng)的流程是不依賴這個(gè)文件日丹,驗(yàn)證流程也就跟上述幾種類型不一樣了。
因?yàn)樯蟼鞯紸ppStore的包蘋果會(huì)重新對(duì)內(nèi)容加密蚯嫌,原來(lái)的本地私鑰簽名就沒(méi)有用了哲虾,需要重新簽名,從AppStore下載的包蘋果也并不打算控制它的有效期择示,不需要內(nèi)置一個(gè)embedded.mobileprovision去做校驗(yàn)束凑,直接在蘋果用后臺(tái)的私鑰重新簽名,iOS安裝時(shí)用本地公鑰驗(yàn)證App簽名就可以了栅盲。
那為什么發(fā)布AppStore的包還是要跟開發(fā)版一樣搞各種證書和Provisioning Profile汪诉,因?yàn)樘O果想做統(tǒng)一管理
,Provisioning Profile里包含一些權(quán)限控制谈秫,AppID 的檢驗(yàn)等扒寄,蘋果不想在上傳AppStore 包時(shí)重新用另一種協(xié)議做一遍這些驗(yàn)證,就不如統(tǒng)一把這部分放在 Provisioning Profile里拟烫,上傳AppStore時(shí)只要用同樣的流程驗(yàn)證這個(gè) Provisioning Profile是否合法就可以了旗们。
所以 App 上傳到AppStore后,就跟你的 證書 / Provisioning Profile 都沒(méi)有關(guān)系了构灸,無(wú)論他們是否過(guò)期或被廢除,都不會(huì)影響AppStore 上的安裝包。
以上就是整個(gè)簽名的大致分析喜颁。