本文主要講解什么是代碼簽名,以及iOS中的應(yīng)用簽名

代碼簽名
代碼簽名是對可執(zhí)行文件或腳本進行數(shù)字簽名.用來確認軟件在簽名后未被修改或損壞的措施。和數(shù)字簽名原理一樣,只不過簽名的數(shù)據(jù)是代碼而已.
目的:防止可執(zhí)行文件或腳本被篡改
簡單的代碼簽名
在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這一個入口這件事就簡單解決了,沒有任何復雜的東西,一個數(shù)字簽名搞定.
但是
實際上iOS安裝APP還有其他渠道.比如對于我們開發(fā)者iOSer而言,我們是需要在開發(fā)APP時直接真機調(diào)試的.而且蘋果還開放了企業(yè)內(nèi)部分發(fā)的渠道,企業(yè)證書簽名的APP也是需要順利安裝的.蘋果需要開放這些方式安裝APP,這些需求就無法通過簡單的代碼簽名來辦到了。
蘋果的需求
作為一個開發(fā)者,有一個學習的氛圍跟一個交流圈子特別重要,這是一個我的iOS開發(fā)交流群:130 595 548,不管你是小白還是大牛都歡迎入駐 ,讓我們一起進步,共同發(fā)展?。ㄈ簝?nèi)會免費提供一些群主收藏的免費學習書籍資料以及整理好的幾百道面試題和答案文檔?。?/strong>
安裝包不需要上傳AppStore,可以直接安裝到手機
-
蘋果為了保證系統(tǒng)的安全性,又必須對安裝的App有絕對的控制權(quán)
- 經(jīng)過蘋果允許才可以安裝
- 不能被濫用導致非開發(fā)App也能被安裝
為了實現(xiàn)這些需求,iOS簽名的復雜度也就開始增加了,蘋果這里給出的方案是 雙層簽名
雙層代碼簽名
為了實現(xiàn)蘋果驗證應(yīng)用的一些需求,iOS簽名的復雜度也就開始增加了,蘋果給出的方案是雙層簽名.
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ù)稱為證書。
蘋果雙向簽名驗證步驟
下面簡述蘋果雙向簽名的步驟
-
1、前提:
- xcode會在keychain生成一對
公鑰M、私鑰M,保存在mac電腦中 - 還有一對
公鑰A(iPhone)、私鑰A(蘋果服務(wù)端)
- xcode會在keychain生成一對
-
2、通過mac中的
公鑰M(核心)+證書頒發(fā)機構(gòu)信息,生成一個CSR文件,傳遞給蘋果服務(wù)器 -
3、蘋果服務(wù)器通過
私鑰A加密公鑰M,生成一個證書,其中包含公鑰M+Hash值,并對公鑰M的Hash值作數(shù)字簽名私鑰A加密公鑰M蘋果服務(wù)器就相當于CA機構(gòu)
證書就是CRT文件
問題:編譯App需要安裝到手機,iPhone如何驗證呢?
- 4、通過mac中的
私鑰M,對App中的Mach-O進行簽名,生成一個App的簽名,同時將證書打包進去,形成一個ipa包-
1)通過mac中的
私鑰M,對App中的Mach-O進行簽名 -
2)生成一個App的簽名
-
3)將Mach-O文件、App簽名、證書等信息一起打包,形成一個ipa包
證書可以由 iPhone中的公鑰A解密私鑰M 就是 p12證書,證書回來后,就會與私鑰M進行綁定
-
雙重驗證
-
5、通過iPhone的
公鑰A 解密 證書,證書解密后得到公鑰M,公鑰M 可以驗證 App的簽名,驗證通過,說明安裝行為是被允許的,合法的以下是Mach-O的簽名信息
注:上述這個過程是有問題的:因為只要申請證書,任何設(shè)備都可以安裝
描述文件
所以蘋果為了解決應(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)進行驗證。-
6、為了限制,蘋果提供了一個權(quán)限文件,即
profile - 描述文件,所以3中的證書是包含在描述文件中的。除此之外還包含設(shè)備id、AppID、權(quán)限文件等信息,其目的有兩個:1)限制免費證書安裝設(shè)備;2)限制免費證書安裝期限,以下是加上描述文件后的雙重驗證過程1)蘋果服務(wù)器提供了一個描述文件,其中包含
CRT證書。2)然后通過mac的
私鑰M對Mach-O文件進行簽名,生成App簽名。3)將
Mach-O文件、App簽名、描述文件一起打包生成ipa包4)將App安裝到iOS設(shè)備中
5)通過iPhone手機的
私鑰A解密描述文件中的CRT證書,解密后得到公鑰M6)然后通過
公鑰M驗證App的簽名。因為App簽名是通過私鑰M進行簽名的,如果驗證通過,則說明安裝是合法的
下面老看下描述文件,以下是描述文件的期限

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

終端命令查看:通過命令查看描述文件(.app包的目錄下):security cms -D -i embedded.mobileprovision
雙重驗證總結(jié)
所以,綜上所述,蘋果的雙重驗證主要是指以下兩次簽名驗證:
1、iOS系統(tǒng)中通過
內(nèi)置的公鑰A驗證CRT證書2、通過1中證書取出的
公鑰M驗證App的簽名
總結(jié)
證書:
公鑰M/私鑰M發(fā)出去,由官方的機構(gòu)對其進行簽名后組成的數(shù)據(jù)包p12 就是
本地私鑰M描述文件:包含證書、權(quán)限文件(Entitlements - 權(quán)限開關(guān))、UUID等信息+權(quán)限。不能修改
-
證書生成流程:
1、通過本地的公鑰M/私鑰M,申請證書 --
CSR文件2、服務(wù)器將
公鑰M進行一次RSA加密,得到CRT證書,3、將
CRT證書下載到本地,與私鑰M(p12)進行綁定
蘋果雙向簽名驗證流程如下圖所示

* 1、在Mac中通過`公鑰M+證書頒發(fā)機構(gòu)信息`生成`CSR文件`
* 2、將`CSR文件`傳遞到蘋果服務(wù)器,申請`CRT證書`
* 3、蘋果服務(wù)器通過`私鑰A加密公鑰M`,生成`CRT證書`,并對公鑰M的hash值進行數(shù)字簽名(即通過RSA加密)。同時蘋果還提供了`描述文件`
* 4、通過`私鑰M`對`Mach-O進行簽名`,生成一個`App的簽名`,同時將描述文件、CRT證書等打包,形成一個`ipa`包
* 5、App安裝到iOS設(shè)備
* 6、從iPhone手機中獲取`公鑰A`,通過公鑰A`解密CRT證書`,得到`公鑰M`
* 7、通過6中得到`公鑰M驗證App的簽名`
-
蘋果的雙重驗證主要是指以下兩次簽名驗證:
1、iOS系統(tǒng)中通過
內(nèi)置的公鑰A驗證CRT證書2、通過1中證書取出的
公鑰M驗證App的簽名
參考鏈接









