本文主要講解什么是代碼簽名,以及iOS中的應(yīng)用簽名
代碼簽名
代碼簽名是對(duì)可執(zhí)行文件或腳本進(jìn)行數(shù)字簽名.用來(lái)確認(rèn)軟件在簽名后未被修改或損壞的措施。和數(shù)字簽名原理一樣,只不過(guò)簽名的數(shù)據(jù)是代碼而已.
目的:防止可執(zhí)行文件或腳本被篡改
簡(jiǎn)單的代碼簽名
在iOS出來(lái)之前,以前的主流操作系統(tǒng)(Mac/Windows)軟件隨便從哪里下載都能運(yùn)行,系統(tǒng)安全存在隱患,盜版軟件,病毒入侵,靜默安裝等等.那么蘋果希望解決這樣的問(wèn)題,要保證每一個(gè)安裝到 iOS 上的 APP 都是經(jīng)過(guò)蘋果官方允許的,怎樣保證呢?就是通過(guò)代碼簽名。
如果要實(shí)現(xiàn)驗(yàn)證.其實(shí)
最簡(jiǎn)單的方式就是通過(guò)蘋果官方生成非對(duì)稱加密的一對(duì)公私鑰.在iOS的系統(tǒng)中內(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ò)蘋果官方允許的.如果我們iOS設(shè)備安裝APP只從App Store這一個(gè)入口這件事就簡(jiǎn)單解決了,沒(méi)有任何復(fù)雜的東西,一個(gè)數(shù)字簽名搞定.
但是
實(shí)際上iOS安裝APP還有其他渠道.比如對(duì)于我們開發(fā)者iOSer而言,我們是需要在開發(fā)APP時(shí)直接真機(jī)調(diào)試的.而且蘋果還開放了企業(yè)內(nèi)部分發(fā)的渠道,企業(yè)證書簽名的APP也是需要順利安裝的.蘋果需要開放這些方式安裝APP,這些需求就無(wú)法通過(guò)簡(jiǎn)單的代碼簽名來(lái)辦到了。
蘋果的需求
安裝包不需要上傳AppStore,可以直接安裝到手機(jī)
-
蘋果為了保證系統(tǒng)的安全性,又必須對(duì)安裝的App有絕對(duì)的控制權(quán)
- 經(jīng)過(guò)蘋果允許才可以安裝
- 不能被濫用導(dǎo)致非開發(fā)App也能被安裝
為了實(shí)現(xiàn)這些需求,iOS簽名的復(fù)雜度也就開始增加了,蘋果這里給出的方案是 雙層簽名
雙層代碼簽名
為了實(shí)現(xiàn)蘋果驗(yàn)證應(yīng)用的一些需求,iOS簽名的復(fù)雜度也就開始增加了,蘋果給出的方案是雙層簽名.
iOS的雙層代碼簽名流程這里簡(jiǎn)單梳理一下,這也不是最終的iOS簽名原理.iOS的最終簽名在這個(gè)基礎(chǔ)上還要稍微加點(diǎn)東西.
首先這里有兩個(gè)角色.一個(gè)是
iOS系統(tǒng)還有一個(gè)就是我們的Mac系統(tǒng).因?yàn)閕OS的APP開發(fā)環(huán)境在Mac系統(tǒng)下.所以這個(gè)依賴關(guān)系成為了蘋果雙層簽名的基礎(chǔ).1、在Mac系統(tǒng)中生成非對(duì)稱加密算法的一對(duì)公鑰\私鑰(你的Xcode幫你代辦了).這里稱為
公鑰M私鑰M(注:M = Mac)2、蘋果自己有固定的一對(duì)公私鑰,跟之前App Store原理一樣,私鑰在蘋果后臺(tái),公鑰在每個(gè)iOS系統(tǒng)中.這里稱為
公鑰A,私鑰A. A=Apple-
3、把公鑰M 以及一些你開發(fā)者的信息,傳到蘋果后臺(tái)(這個(gè)就是
CSR文件),用蘋果后臺(tái)里的私鑰 A 去簽名公鑰M。得到一份數(shù)據(jù)包含了公鑰M 以及其簽名,把這份數(shù)據(jù)稱為證書。
雙重簽名圖示
蘋果雙向簽名驗(yàn)證步驟
下面簡(jiǎn)述蘋果雙向簽名的步驟
-
1、前提:
蘋果雙向簽名驗(yàn)證流程-01- xcode會(huì)在keychain生成一對(duì)
公鑰M、私鑰M,保存在mac電腦中 - 還有一對(duì)
公鑰A(iPhone)、私鑰A(蘋果服務(wù)端)
- xcode會(huì)在keychain生成一對(duì)
-
2、通過(guò)mac中的
公鑰M(核心)+證書頒發(fā)機(jī)構(gòu)信息,生成一個(gè)CSR文件,傳遞給蘋果服務(wù)器
蘋果雙向簽名驗(yàn)證流程-02 -
3、蘋果服務(wù)器通過(guò)
私鑰A加密公鑰M,生成一個(gè)證書,其中包含公鑰M+Hash值,并對(duì)公鑰M的Hash值作數(shù)字簽名
蘋果雙向簽名驗(yàn)證流程-03私鑰A加密公鑰M蘋果服務(wù)器就相當(dāng)于CA機(jī)構(gòu)
證書就是CRT文件
問(wèn)題:編譯App需要安裝到手機(jī),iPhone如何驗(yàn)證呢?
- 4、通過(guò)mac中的
私鑰M,對(duì)App中的Mach-O進(jìn)行簽名,生成一個(gè)App的簽名,同時(shí)將證書打包進(jìn)去,形成一個(gè)ipa包- 1)通過(guò)mac中的
私鑰M,對(duì)App中的Mach-O進(jìn)行簽名
蘋果雙向簽名驗(yàn)證流程-04 -
2)生成一個(gè)App的簽名
蘋果雙向簽名驗(yàn)證流程-05 -
3)將Mach-O文件、App簽名、證書等信息一起打包,形成一個(gè)ipa包
蘋果雙向簽名驗(yàn)證流程-06 -
證書可以由 iPhone中的公鑰A解密 - 私鑰M 就是 p12證書,證書回來(lái)后,就會(huì)與私鑰M進(jìn)行綁定
- 1)通過(guò)mac中的
雙重驗(yàn)證
- 5、通過(guò)iPhone的
公鑰A 解密 證書,證書解密后得到公鑰M,公鑰M 可以驗(yàn)證 App的簽名,驗(yàn)證通過(guò),說(shuō)明安裝行為是被允許的,合法的
蘋果雙向簽名驗(yàn)證流程-07
以下是Mach-O的簽名信息
蘋果雙向簽名驗(yàn)證流程-08
注:上述這個(gè)過(guò)程是有問(wèn)題的:因?yàn)橹灰暾?qǐng)證書,任何設(shè)備都可以安裝
描述文件
所以蘋果為了解決應(yīng)用濫用的問(wèn)題,所以蘋果又加了兩個(gè)限制.
第一限制在蘋果后臺(tái)
注冊(cè)過(guò)的設(shè)備才可以安裝.第二限制
簽名只能針對(duì)某一個(gè)具體的APP.
并且蘋果還想控制App里面的iCloud/PUSH/后臺(tái)運(yùn)行/調(diào)試器附加這些權(quán)限,所以蘋果把這些權(quán)限開關(guān)統(tǒng)一稱為Entitlements(授權(quán)文件).并將這個(gè)文件放在了一個(gè)叫做Provisioning Profile(描述文件)文件中.
描述文件是在AppleDevelop網(wǎng)站創(chuàng)建的(在Xcode中填上AppleID它會(huì)代辦創(chuàng)建),Xcode運(yùn)行時(shí)會(huì)打包進(jìn)入APP內(nèi).所以我們
使用CSR申請(qǐng)證書時(shí),我們還要申請(qǐng)一個(gè)東西!! 就是描述文件!在開發(fā)時(shí),編譯完一個(gè) APP 后,用
本地的私鑰M對(duì)這個(gè)APP進(jìn)行簽名,同時(shí)把從蘋果服務(wù)器得到的 Provisioning Profile 文件打包進(jìn)APP里,文件名為embedded.mobileprovision,把 APP 安裝到手機(jī)上.最后系統(tǒng)進(jìn)行驗(yàn)證。-
6、為了限制,蘋果提供了一個(gè)權(quán)限文件,即
profile - 描述文件,所以3中的證書是包含在描述文件中的。除此之外還包含設(shè)備id、AppID、權(quán)限文件等信息,其目的有兩個(gè):1)限制免費(fèi)證書安裝設(shè)備;2)限制免費(fèi)證書安裝期限,以下是加上描述文件后的雙重驗(yàn)證過(guò)程
蘋果雙向簽名驗(yàn)證流程-091)蘋果服務(wù)器提供了一個(gè)描述文件,其中包含
CRT證書。2)然后通過(guò)mac的
私鑰M對(duì)Mach-O文件進(jìn)行簽名,生成App簽名。3)將
Mach-O文件、App簽名、描述文件一起打包生成ipa包4)將App安裝到iOS設(shè)備中
5)通過(guò)iPhone手機(jī)的
私鑰A解密描述文件中的CRT證書,解密后得到公鑰M6)然后通過(guò)
公鑰M驗(yàn)證App的簽名。因?yàn)?code>App簽名是通過(guò)私鑰M進(jìn)行簽名的,如果驗(yàn)證通過(guò),則說(shuō)明安裝是合法的
下面老看下描述文件,以下是描述文件的期限

且在編譯好的App包中,同樣可以看到描述文件

終端命令查看:通過(guò)命令查看描述文件(.app包的目錄下):
security cms -D -i embedded.mobileprovision
雙重驗(yàn)證總結(jié)
所以,綜上所述,蘋果的雙重驗(yàn)證主要是指以下兩次簽名驗(yàn)證:
1、iOS系統(tǒng)中通過(guò)
內(nèi)置的公鑰A驗(yàn)證CRT證書2、通過(guò)1中證書取出的
公鑰M驗(yàn)證App的簽名
總結(jié)
證書:
公鑰M/私鑰M發(fā)出去,由官方的機(jī)構(gòu)對(duì)其進(jìn)行簽名后組成的數(shù)據(jù)包p12 就是
本地私鑰M描述文件:包含證書、權(quán)限文件(Entitlements - 權(quán)限開關(guān))、UUID等信息+權(quán)限。不能修改
-
證書生成流程:
1、通過(guò)本地的公鑰M/私鑰M,申請(qǐng)證書 --
CSR文件2、服務(wù)器將
公鑰M進(jìn)行一次RSA加密,得到CRT證書,3、將
CRT證書下載到本地,與私鑰M(p12)進(jìn)行綁定
-
蘋果雙向簽名驗(yàn)證流程如下圖所示
蘋果雙向簽名驗(yàn)證流程1、在Mac中通過(guò)
公鑰M+證書頒發(fā)機(jī)構(gòu)信息生成CSR文件2、將
CSR文件傳遞到蘋果服務(wù)器,申請(qǐng)CRT證書3、蘋果服務(wù)器通過(guò)
私鑰A加密公鑰M,生成CRT證書,并對(duì)公鑰M的hash值進(jìn)行數(shù)字簽名(即通過(guò)RSA加密)。同時(shí)蘋果還提供了描述文件4、通過(guò)
私鑰M對(duì)Mach-O進(jìn)行簽名,生成一個(gè)App的簽名,同時(shí)將描述文件、CRT證書等打包,形成一個(gè)ipa包5、App安裝到iOS設(shè)備
6、從iPhone手機(jī)中獲取
公鑰A,通過(guò)公鑰A解密CRT證書,得到公鑰M7、通過(guò)6中得到
公鑰M驗(yàn)證App的簽名
-
蘋果的雙重驗(yàn)證主要是指以下兩次簽名驗(yàn)證:
1、iOS系統(tǒng)中通過(guò)
內(nèi)置的公鑰A驗(yàn)證CRT證書2、通過(guò)1中證書取出的
公鑰M驗(yàn)證App的簽名
參考鏈接










