1.簡單的簽名認證原理
App的認證是通過RSA(非對稱加密)+應用的Hash值進行數(shù)字簽名認證!
APP Store 中存有私鑰,手機中存放公鑰!當我們打包到蘋果商店時,實際上App Store獲取了應用包的Hash值,然后用私鑰加密(也叫數(shù)字簽名),當我們下載App時,IPA中包含簽名等信息會一起下載到手機上,用手機上的公鑰去解密簽名,然后得到hash值,手機本身也會去獲取應用的hash值,然后對比,如果一樣則認為我們的APP沒有篡改過,是從官方下載的,然后開始安裝!
但是安裝包可以不需要上傳到App Store,也可以直接安裝到手機上!
此時蘋果為了保證系統(tǒng)的安全性,又必須對安裝的APP有絕對的控制權
- 經(jīng)過蘋果允許才可以安裝
- 不能被濫用導致非開發(fā)APP也能被安裝
為了實現(xiàn)這些需求,iOS簽名的復雜度也就開始增加了,蘋果這里給出的方案是雙層簽名!
2.雙向簽名
在Mac系統(tǒng)中生成非對稱加密算法的一對公鑰\私鑰, 蘋果自己有固定的一對公私鑰,跟之前App Store原理一樣,私鑰在蘋果后臺服務器中(暫時先這么認為),公鑰在每個iOS系統(tǒng)中
把公鑰M以及一些開發(fā)者的信息,傳到蘋果后臺(這個就是CSR文件),用蘋果后臺里的私鑰A去簽名公鑰M,這個Hash值是公鑰M的Hash。
得到一份文件,其包含了公鑰M 以及簽名(把公鑰M的hash值算出來,一并放到證書中),把這份數(shù)據(jù)稱為證書(證書就是對公鑰M的一個數(shù)字簽名),當Mac拿到證書后,會將私鑰與證書進行關聯(lián)(秘鑰M就是證書中的密鑰) ,或者你也可以認為就是導出后的P12文件
在開發(fā)時,編譯完一個APP后,用本地的私鑰M(導出的P12)對這個APP中的mach-o和framework進行簽名(就是獲取到App的Hash值,用Mac私鑰進行加密),同時把得到的證書也一起打包進 APP 里,安裝到手機上。
在安裝時,iOS系統(tǒng)取得證書,通過系統(tǒng)內置的公鑰A,去驗證證書的數(shù)字簽名是否正確。
驗證證書后確保了鑰M是蘋果認證過的,再用公鑰M去驗證APP的簽名,這里就間接驗證了這個APP安裝 行為是否經(jīng)過蘋果官方允許。(這里只驗證安裝行為,不驗證APP 是否被改動,也不會去比較HASH值,因為開發(fā)階段 APP 內容總是不斷變化的)
大體流程如圖:
但是雖然經(jīng)過了上面的過程,已經(jīng)可以保證開發(fā)者的認證,和程序的安全性了。 但是,你要知道iOS的程序,主要渠道是要 通過APP Store才能分發(fā)到用戶設備的,如果只有上述的過程,那豈不是只要申請了一個證書,就可以安裝到所有 iOS設備了?
蘋果為了解決應用濫用的問題,所以蘋果又加了兩個限制!
- 第一限制在蘋果后臺注冊過的設備才可以安裝!
- 第二限制簽名只能針對某一個具體的APP!
- 此時蘋果還想控制App里面的iCloud/PUSH/后臺運行/調試器附加這些權限,所以蘋果把這些權限開關統(tǒng)一稱為Entitlements(權限文件)這個文件放在了描述文件文件中.,描述文件是在AppleDevelop網(wǎng)站創(chuàng)建的(在Xcode中填上AppleID它會代辦創(chuàng)建),Xcode運行時會打包進入APP內.
- 所以我們使用CSR申請證書時,我們還要申請一個描述文件!在開發(fā)時,編譯完一個 APP 后,用本地的私鑰M對這個APP進行簽名,同時把從蘋果服務器得到的 Provisioning Profile 文件打包進APP里,因為有了這個描述文件中的一些必要信息。把 APP 安裝到手機上后,系統(tǒng)進行驗證,避免了濫用等問題!
如下圖:
其他:
相應指令:security cms -D -i