????????代碼簽名是對可執(zhí)行文件或腳本進行數(shù)字簽名.用來確認軟件在簽名后未被修改或損壞的措施芹壕。和數(shù)字簽名原理一樣,只不過簽名的數(shù)據(jù)是代碼而已.
????????在iOS出來之前,以前的主流操作系統(tǒng)(Mac/Windows)軟件隨便從哪里下載都能運行,系統(tǒng)安全存在隱患,盜版軟件,病毒入侵,靜默安裝等等.那么蘋果希望解決這樣的問題,要保證每一個安裝到 iOS 上的 APP 都是經(jīng)過蘋果官方允許的,怎樣保證呢?就是通過代碼簽名浅蚪。
????????如果要實現(xiàn)驗證.其實最簡單的方式就是通過蘋果官方生成非對稱加密的一對公私鑰.在iOS的系統(tǒng)中內(nèi)置一個公鑰,私鑰由蘋果后臺保存,我們傳APP到AppStore時,蘋果后臺用私鑰對APP數(shù)據(jù)進行簽名,iOS系統(tǒng)下載這個APP后,用公鑰驗證這個簽名,若簽名正確,這個APP肯定是由蘋果后臺認證的,并且沒有被修改過,也就達到了蘋果的需求:保證安裝的每一個APP都是經(jīng)過蘋果官方允許的.
????????如果我們iOS設(shè)備安裝APP只從App Store這一個入口這件事就簡單解決了,沒有任何復(fù)雜的東西,一個數(shù)字簽名搞定.?
????????但是實際上iOS安裝APP還有其他渠道.比如對于我們開發(fā)者iOSER而言,我們是需要在開發(fā)APP時直接真機調(diào)試的.而且蘋果還開放了企業(yè)內(nèi)部分發(fā)的渠道,企業(yè)證書簽名的APP也是需要順利安裝的.蘋果需要開放這些方式安裝APP,這些需求就無法通過簡單的代碼簽名來辦到了例证。
蘋果的需求:
? 安裝包不需要上傳到App Store,可以直接安裝到手機上.
? 蘋果為了保證系統(tǒng)的安全性,又必須對安裝的APP有絕對的控制權(quán)
? 經(jīng)過蘋果允許才可以安裝
? 不能被濫用導(dǎo)致非開發(fā)APP也能被安裝
為了實現(xiàn)這些去求栈妆,iOS簽名的復(fù)雜度也就開始增加了,蘋果這里給出的方案是雙層簽名愕提。
????????iOS的雙層代碼簽名流程這里簡單梳理一下,這也不是最終的iOS簽名原理.iOS的最終簽名在這個基礎(chǔ)上還要稍微加點東西.?首先這里有兩個角色.一個是iOS系統(tǒng) 還有一個就是我們的Mac系統(tǒng).因為iOS的APP開發(fā)環(huán)境在Mac系統(tǒng)下.所以這個依賴關(guān)系成為了蘋果雙層簽名的基礎(chǔ).
1.在Mac系統(tǒng)中生成非對稱加密算法的一對公鑰\私鑰(你的Xcode幫你代辦了).這里稱為公鑰M私鑰M . M = Mac
2.蘋果自己有固定的一對公私鑰,跟之前App Store原理一樣,私鑰在蘋果后臺,公鑰在每個iOS系統(tǒng)中.這里稱為公鑰A ,?私鑰A. A=Apple
3.把公鑰M?以及一些你開發(fā)者的信息,傳到蘋果后臺(這個就是CSR文件)锐墙,用蘋果后臺里的私鑰A?去簽名公鑰M析校。得到一份數(shù)據(jù)包含了公鑰M?以及其簽名构罗,把這份數(shù)據(jù)稱為證書。
4.在開發(fā)時勺良,編譯完一個APP?后绰播,用本地的私鑰M(今后你導(dǎo)出的P12)?對這個?APP?進行簽名,同時把第三步得到的證書一起打包進APP?里尚困,安裝到手機上蠢箩。
5.在安裝時,iOS系統(tǒng)取得證書,通過系統(tǒng)內(nèi)置的公鑰A谬泌,去驗證證書的數(shù)字簽名是否正確滔韵。
6.驗證證書后確保了公鑰?M?是蘋果認證過的,再用公鑰M?去驗證?APP?的簽名掌实,這里就間接驗證了這個APP?安裝行為是否經(jīng)過蘋果官方允許陪蜻。(這里只驗證安裝行為,不驗證APP?是否被改動贱鼻,因為開發(fā)階段APP?內(nèi)容總是不斷變化的宴卖,蘋果不需要管。)
????????有了上面的過程邻悬,已經(jīng)可以保證開發(fā)者的認證症昏,和程序的安全性了。 但是父丰,你要知道iOS的程序肝谭,主要渠道是要通過APP Store才能分發(fā)到用戶設(shè)備的,如果只有上述的過程蛾扇,那豈不是只要申請了一個證書攘烛,就可以安裝到所有iOS設(shè)備了?
?描述文件
????????描述文件(Provisioning profile)一般包括三樣?xùn)|西:證書镀首、App ID坟漱、設(shè)備。當(dāng)我們在真機運行或者打包一個項目的時候蘑斧,證書用來證明我們程序的安全性和合法性靖秩。
?蘋果為了解決應(yīng)用濫用的問題,所以蘋果又加了兩個限制.
?第一限制在蘋果后臺注冊過的設(shè)備才可以安裝.
?第二限制簽名只能針對某一個具體的APP.
?????????并且蘋果還想控制App里面的iCloud/PUSH/后臺運行/調(diào)試器附加這些權(quán)限,所以蘋果把這些權(quán)限開關(guān)統(tǒng)一稱為Entitlements(授權(quán)文件).并將這個文件放在了一個叫做Provisioning Profile(描述文件)文件中. 描述文件是在AppleDevelop網(wǎng)站創(chuàng)建的(在Xcode中填上AppleID它會代辦創(chuàng)建),Xcode運行時會打包進入APP內(nèi).所以我們使用CSR申請證書時,我們還要申請一個東西!!就是描述文件!
?????????在開發(fā)時,編譯完一個?APP?后,用本地的私鑰M對這個APP進行簽名,同時把從蘋果服務(wù)器得到的?Provisioning Profile?文件打包進APP里,文件名為embedded.mobileprovision,把?APP?安裝到手機上.最后系統(tǒng)進行驗證。