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