iOS開發(fā)證書以及包簽名

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算法原理(一)(二)

image.png

  1. 首先用一種算法需纳,算出原始數(shù)據(jù)的摘要。需滿足
    a.若原始數(shù)據(jù)有任何變化兵扬,計(jì)算出來(lái)的摘要值都會(huì)變化。
    b.摘要要夠短津坑。這里最常用的算法是MD5疆瑰。
  2. 生成一份非對(duì)稱加密的公鑰和私鑰昙啄,私鑰我自己拿著梳凛,公鑰公布出去。
  3. 對(duì)一份數(shù)據(jù)淹接,算出摘要后叛溢,用私鑰加密這個(gè)摘要楷掉,得到一份加密后的數(shù)據(jù),稱為原始數(shù)據(jù)的簽名。把它跟原始數(shù)據(jù)一起發(fā)送給用戶刊橘。
  4. 用戶收到數(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ò)蘋果官方允許的

image.png

三心铃、其他方式安裝APP

  1. Debug開發(fā)App時(shí)可以直接把開發(fā)中的應(yīng)用安裝進(jìn)手機(jī)調(diào)試去扣;
  2. In-House企業(yè)內(nèi)部分發(fā)暮顺,可以直接安裝企業(yè)證書簽名后的App;
  3. 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è)簽名的大致分析喜颁。

參考文章

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末稠氮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子半开,更是在濱河造成了極大的恐慌隔披,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寂拆,死亡現(xiàn)場(chǎng)離奇詭異奢米,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)纠永,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門鬓长,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人尝江,你說(shuō)我怎么就攤上這事涉波。” “怎么了炭序?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵啤覆,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我惭聂,道長(zhǎng)窗声,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任辜纲,我火速辦了婚禮笨觅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘侨歉。我一直安慰自己屋摇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布幽邓。 她就那樣靜靜地躺著炮温,像睡著了一般。 火紅的嫁衣襯著肌膚如雪牵舵。 梳的紋絲不亂的頭發(fā)上柒啤,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音畸颅,去河邊找鬼担巩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛没炒,可吹牛的內(nèi)容都是我干的涛癌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼拳话!你這毒婦竟也來(lái)了先匪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤弃衍,失蹤者是張志新(化名)和其女友劉穎呀非,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體镜盯,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡岸裙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了速缆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片降允。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖激涤,靈堂內(nèi)的尸體忽然破棺而出拟糕,到底是詐尸還是另有隱情,我是刑警寧澤倦踢,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布送滞,位于F島的核電站,受9級(jí)特大地震影響辱挥,放射性物質(zhì)發(fā)生泄漏犁嗅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一晤碘、第九天 我趴在偏房一處隱蔽的房頂上張望褂微。 院中可真熱鬧,春花似錦园爷、人聲如沸宠蚂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)求厕。三九已至,卻和暖如春扰楼,著一層夾襖步出監(jiān)牢的瞬間呀癣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工弦赖, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留项栏,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓蹬竖,卻偏偏與公主長(zhǎng)得像沼沈,于是被迫代替她去往敵國(guó)和親流酬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容