前言
iOS真機(jī)調(diào)試宫莱、App打包等過(guò)程涉及到各種證書(shū),CertificateSigningRequest投慈、p12荧降、Provisioning Profile专挪。這些證書(shū)是什么,為什么需要這么做,相信很多同學(xué)是模糊的及志。本文從原理出發(fā),一步步推出為什么會(huì)有這么多概念,有助于理解iOS App簽名的原理和流程。
簽名目的
?在iOS出來(lái)之前,以前的主流操作系統(tǒng)(Mac/Windows)軟件隨便從哪里下載都能運(yùn)行,系統(tǒng)安全存在隱患,盜版軟件,病毒入侵,靜默安裝等等寨腔。那么蘋(píng)果希望解決這樣的問(wèn)題,要保證每一個(gè)安裝到 iOS 上的 APP 都是經(jīng)過(guò)蘋(píng)果官方允許的,怎樣保證呢?就是通過(guò)代碼簽名速侈。
?非對(duì)稱(chēng)加密RSA原理
RSA 算法的可靠性基礎(chǔ):對(duì)極大整數(shù)做因數(shù)分解是很困難的。RSA 是非對(duì)稱(chēng)算法迫卢,加解密使用不同的密鑰倚搬。
兩個(gè)密鑰都可以用于加密,解密時(shí)需要使用另一個(gè)密鑰乾蛤。但是每界,通常用公鑰加密私鑰解密,因?yàn)楣€是近乎完全公開(kāi)的家卖,對(duì)于私鑰加密的數(shù)據(jù)眨层,有太多的人可以解密了。理論上 A 和 B 之間要通過(guò) RSA 實(shí)現(xiàn)保密通信上荡,需要 A 和 B 各自生成一組密鑰趴樱,同時(shí)保管好自己的私鑰;用對(duì)方的公鑰加密要發(fā)送的消息,用自己的私鑰解密對(duì)方發(fā)送過(guò)來(lái)的消息叁征。
在簽名的場(chǎng)景下纳账,用私鑰簽名,公鑰驗(yàn)簽航揉。
蘋(píng)果的需求
安裝包不需要傳到蘋(píng)果服務(wù)器塞祈,可以直接安裝到手機(jī)上。如果你編譯一個(gè)App到手機(jī)前要先傳到蘋(píng)果服務(wù)器簽名帅涂,這顯然是不能接受的。
蘋(píng)果必須對(duì)這里的安裝有控制權(quán)尤蛮,包括:
a.經(jīng)過(guò)蘋(píng)果允許才可以這樣安裝;
b. 不能被濫用導(dǎo)致非開(kāi)發(fā)App也能這樣安裝媳友;
為了實(shí)現(xiàn)這些需求,蘋(píng)果這里給出的方案是使用了雙層簽名产捞,流程大概是這樣的:
1.在你的 Mac 開(kāi)發(fā)機(jī)器生成一對(duì)公私鑰醇锚,這里稱(chēng)為Mac公鑰,Mac私鑰坯临。
2.蘋(píng)果自己有固定的一對(duì)公私鑰焊唬,私鑰在蘋(píng)果后臺(tái),公鑰在每個(gè)iOS設(shè)備上看靠。這里稱(chēng)為Apple公鑰赶促,Apple私鑰。
3.把Mac公鑰傳到蘋(píng)果后臺(tái)挟炬,用蘋(píng)果后臺(tái)里的Apple私鑰去簽名Mac公鑰鸥滨。得到一份數(shù)據(jù)包含Mac公鑰以及其簽名,把這份數(shù)據(jù)稱(chēng)為證書(shū)谤祖。
4.在蘋(píng)果后臺(tái)申請(qǐng)AppID婿滓,配置好設(shè)備ID列表和APP可使用的權(quán)限,再加上第③步的證書(shū)粥喜,組成的數(shù)據(jù)用Apple私鑰簽名凸主,把數(shù)據(jù)和簽名一起組成一個(gè)Provisioning Profile文件,下載到本地Mac開(kāi)發(fā)機(jī)额湘。
5.在開(kāi)發(fā)時(shí)卿吐,編譯完一個(gè)APP后,用本地的Mac私鑰對(duì)這個(gè)APP進(jìn)行簽名缩挑,同時(shí)把第④步得到的Provisioning Profile文件打包進(jìn)APP里但两,文件名為embedded.mobileprovision,把APP安裝到手機(jī)上供置。
6.7.安裝時(shí)谨湘,通過(guò)系統(tǒng)內(nèi)置的Apple公鑰,去驗(yàn)證?embedded.mobileprovision的數(shù)字簽名是否正確,里面的證書(shū)簽名也會(huì)再驗(yàn)一遍紧阔。
8.確保了embedded.mobileprovision里的數(shù)據(jù)都是蘋(píng)果授權(quán)以后坊罢,就可以取出里面的數(shù)據(jù),做各種驗(yàn)證擅耽,包括用Mac公鑰驗(yàn)證APP簽名活孩,驗(yàn)證設(shè)備ID是否在ID列表上,AppID是否對(duì)應(yīng)得上乖仇,權(quán)限開(kāi)關(guān)是否跟APP里的Entitlements對(duì)應(yīng)等憾儒。
其他發(fā)布方式
另外兩種方式In-House企業(yè)簽名和AD-Hoc流程也是差不多的,只是企業(yè)簽名不限制安裝的設(shè)備數(shù)乃沙,另外需要用戶(hù)在iOS系統(tǒng)設(shè)置上手動(dòng)點(diǎn)擊信任這個(gè)企業(yè)才能通過(guò)驗(yàn)證起趾。
而AppStore的簽名驗(yàn)證方式有些不一樣,如果去下載一個(gè)AppStore的安裝包警儒,會(huì)發(fā)現(xiàn)它里面是沒(méi)有embedded.mobileprovision文件的训裆,也就是它安裝和啟動(dòng)的流程是不依賴(lài)這個(gè)文件。