代碼簽名
代碼簽名是對可執(zhí)行文件或腳本進(jìn)行數(shù)字簽名.用來確認(rèn)軟件在簽名后未被修改或損壞的措施颂斜。和數(shù)字簽名原理一樣,只不過簽名的數(shù)據(jù)是代碼而已
iOS的系統(tǒng)中內(nèi)置一個公鑰,私鑰由蘋果后臺保存,我們傳APP到AppStore時,蘋果后臺用私鑰對APP數(shù)據(jù)進(jìn)行簽名,iOS系統(tǒng)下載這個APP后,用公鑰驗證這個簽名,若簽名正確,這個APP肯定是由蘋果后臺認(rèn)證的,并且沒有被修改過,也就達(dá)到了蘋果的需求:保證安裝的每一個APP都是經(jīng)過蘋果官方允許的.
簡單來說击喂,上架的app蘋果服務(wù)器用私鑰對app進(jìn)行簽名,安裝到手機(jī)上用公鑰驗證簽名
而開發(fā)階段乐埠,則需要用到雙層簽名
雙層簽名
請求文件csr。
首先 MAC有公鑰M和私鑰M(p12)
iphone有個公鑰A 蘋果服務(wù)器私鑰A
通過csr文件申請證書津滞,將公鑰M傳遞給蘋果服務(wù)器豆混,服務(wù)器通過私鑰A簽名 生成證書(公鑰M與hash值),下載這個證書就會將公鑰m和私鑰m進(jìn)行綁定
手機(jī)的公鑰A可以解析這個證書,得到公鑰M
xcode對通過鑰匙串訪問使用私鑰M對app的macho進(jìn)行簽名 嗜逻,
安裝app的時候iphone的私鑰A驗證證書涩僻,得到公鑰M。公鑰M可以解析這個APP簽名, 通過栈顷,說明安裝行為是官方允許的逆日,也就是這個app是合法的 ,然后安裝到手機(jī)上萄凤。
當(dāng)然免費(fèi)證書有個數(shù)和時間限制室抽,而開發(fā)人員大多使用開發(fā)者賬號,所以蘋果為了做權(quán)限限制就使用了描述文件
蘋果簽名后返回的證書實(shí)際上存到了描述文件中靡努。描述文件用來做權(quán)限限制
描述文件:設(shè)備IDs, APPID坪圾,權(quán)限文件(Entitlements開關(guān))晓折,證書。更改之后無法驗證通過
描述文件內(nèi)容
證書:公鑰由官方進(jìn)行簽名
p12:本地私鑰兽泄,可以給其他電腦用
資源文件 簽名 保存在下面
主程序的應(yīng)用簽名信息在macho的code signature中
流程圖:
總結(jié):
在Mac系統(tǒng)中生成非對稱加密算法的一對公鑰\私鑰(你的Xcode幫你代辦了).這里稱為公鑰M 私鑰M . M = Mac
蘋果自己有固定的一對公私鑰,跟之前App Store原理一樣,私鑰在蘋果后臺,公鑰在每個iOS系統(tǒng)中.這里稱為公鑰A , 私鑰A. A=Apple
把公鑰M 以及一些你開發(fā)者的信息,傳到蘋果后臺(這個就是CSR文件)漓概,用蘋果后臺里的私鑰 A 去簽名公鑰M。得到一份數(shù)據(jù)包含了公鑰M 以及其簽名病梢,把這份數(shù)據(jù)稱為證書胃珍。
在開發(fā)時,編譯完一個 APP 后飘千,用本地的私鑰 M(今后你導(dǎo)出的P12) 對這個 APP 進(jìn)行簽名堂鲜,同時把第三步得到的證書一起打包進(jìn) APP 里栈雳,安裝到手機(jī)上护奈。
在安裝時,iOS 系統(tǒng)取得證書哥纫,通過系統(tǒng)內(nèi)置的公鑰 A霉旗,去驗證證書的數(shù)字簽名是否正確。
驗證證書后確保了鑰 M 是蘋果認(rèn)證過的蛀骇,再用公鑰 M 去驗證 APP 的簽名厌秒,這里就間接驗證了這個 APP 安裝行為是否經(jīng)過蘋果官方允許。(這里只驗證安裝行為擅憔,不驗證APP 是否被改動鸵闪,因為開發(fā)階段 APP 內(nèi)容總是不斷變化的,蘋果不需要管暑诸。)
蘋果為了解決應(yīng)用濫用的問題,所以蘋果又加了兩個限制.
第一限制在蘋果后臺注冊過的設(shè)備才可以安裝.
第二限制簽名只能針對某一個具體的APP.
并且蘋果還想控制App里面的iCloud/PUSH/后臺運(yùn)行/調(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運(yùn)行時會打包進(jìn)入APP內(nèi).?所以我們使用CSR申請證書時,我們還要申請一個東西!! 就是描述文件!
在開發(fā)時,編譯完一個 APP 后,用本地的私鑰M對這個APP進(jìn)行簽名,同時把從蘋果服務(wù)器得到的 Provisioning Profile 文件打包進(jìn)APP里,文件名為embedded.mobileprovision,把 APP 安裝到手機(jī)上.最后系統(tǒng)進(jìn)行驗證蚌讼。