代碼簽名
什么是代碼簽名
????代碼簽名是對可執(zhí)行文件或腳本進(jìn)行數(shù)字簽名,用來確認(rèn)軟件的來源并保證在簽名后未被修改或損壞的措施彰触。和數(shù)字簽名原理一樣,只不過簽名的數(shù)據(jù)是代碼而已.數(shù)字簽名使用非對稱加密和哈希函數(shù)來確保數(shù)據(jù)的完整性梯投,可以用于識別和驗(yàn)證簽名者。
代碼簽名的好處
- 確保一段代碼自簽名后未被更改况毅。系統(tǒng)甚至可以檢測到最小的更改分蓖,無論是有意的(例如惡意攻擊者)還是意外的(例如文件損壞時(shí))。當(dāng)代碼簽名完好無損時(shí)尔许,系統(tǒng)可以確定代碼與簽名者的預(yù)期相符么鹤。
- 將代碼標(biāo)識為來自特定來源(開發(fā)人員或簽名者)。代碼簽名包括明確指向特定作者的密碼信息味廊。
- 確定代碼對于特定目的是否值得信賴蒸甜。除此之外,開發(fā)人員可以使用代碼簽名來聲明應(yīng)用程序的更新版本應(yīng)被系統(tǒng)視為與先前版本相同的應(yīng)用程序余佛。
蘋果簽名過程
證書和密鑰
-
CSR
文件
????通常柠新,在開發(fā)使用的機(jī)器上應(yīng)該已經(jīng)有一個(gè)開發(fā)者證書,一個(gè)公鑰辉巡,以及一個(gè)私鑰恨憎。 這些是代碼簽名機(jī)制的核心。像 SSL 一樣郊楣,代碼簽名也依賴于采用 X.509 標(biāo)準(zhǔn)的公開密鑰加密憔恳。開發(fā)者通過 Key Chain 生成 CertificateSigningRequest(證書請求文件) 文件瓤荔,這個(gè)文件里面包含了開發(fā)者的個(gè)人信息和公鑰,并且在申請時(shí)私鑰保存在本地钥组。
-
CER
文件
????開發(fā)者將 CSR 文件上傳至蘋果網(wǎng)站提交給 Apple Worldwide Developer Relations Certification Authority(Apple WWDRCA)茉贡。Apple WWDRCA 會使用其根證書私鑰簽名生成了.cer
證書文件,這個(gè)證書里面包含了開發(fā)者的信息和公鑰者铜,以及數(shù)字簽名腔丧。????在 OS X 上,X.509 的基本組成部分(例如證書等)都是由一個(gè)叫Key chain(鑰匙串訪問)的工具來進(jìn)行管理作烟。當(dāng)下載 CER 文件安裝至鑰匙串時(shí)愉粤,鑰匙串會將這兩個(gè)證書進(jìn)行關(guān)聯(lián),要用一個(gè)證書設(shè)置代碼簽名拿撩,必須擁有私鑰衣厘,所有證書的私鑰都會被列在這里。 還有一種可以用來快速地顯示出系統(tǒng)中能用來對代碼進(jìn)行簽名的認(rèn)證的方法压恒,那就是利用用途廣泛的命令行工具 security:
security find-identity -v -p codesigning
P12
文件
????當(dāng) CER 安裝到鑰匙串中影暴,開發(fā)者將其導(dǎo)出為.P12
格式的文件,這個(gè)文件中不僅包含了公鑰信息探赫,還有私鑰信息型宙,以及數(shù)字簽名。
授權(quán)機(jī)制(Entitlements) 和 配置文件 (Provisioning)
????蘋果對 App 的 部分功能設(shè)定了權(quán)限開關(guān)伦吠,把這些權(quán)限開關(guān)統(tǒng)一稱為 Entitlements(授權(quán)文件)妆兑,并且對安裝的設(shè)備(Device)做了限制,需要注冊的設(shè)備才可以 安裝毛仪,將AppId
搁嗓、Device
、Entitlements
以及其他信息保存到了 Provisioning Profile(描述文件)文件中箱靴。
????當(dāng)開發(fā)者下載 .mobileprovision
文件后雙擊運(yùn)行腺逛,Xcode 通常會將其存放在 ~/Library/MobileDevice/Provisioning Profiles/
目錄中。開發(fā)者可以前往該目錄或者安裝 ProfilesManager.app
進(jìn)行查看當(dāng)前電腦下的描述文件衡怀。 可以通過下面命令查看下載后的描述文件信息:
security cms -D -i <mobileprovision文件路徑>
????通過查看后棍矛,我們可以發(fā)現(xiàn) Provisioning Profile 文件其實(shí)是 plist 文件, 當(dāng)然狈癞,Provisioning Profile文件也是經(jīng)過服務(wù)器數(shù)字簽名的茄靠,所以它是防篡改的茂契。
codesign
????蘋果對 App 簽名過程本身是由命令行工具 codesign
來完成的蝶桶。通常,Xcode 會處理大多數(shù)代碼簽名任務(wù)掉冶,幫助管理代碼簽名身份真竖,并將代碼簽名應(yīng)用于構(gòu)建和分發(fā)的應(yīng)用程序脐雪。需要注意的是 Xcode 只允許在有限的選項(xiàng)中進(jìn)行選擇,這些選項(xiàng)都是既擁有公鑰也擁有私鑰的證書恢共。當(dāng)然了战秋,開發(fā)者也可以使用 codesign 工具進(jìn)行手動簽名:
-
手動代碼簽名
codesign -s <身份> -v <代碼路徑>
-
檢查代碼簽名
codesign -v <代碼路徑>
-
獲取有關(guān)代碼簽名信息
codesign -d -r- <代碼路徑>
那么在簽名過程中,codeSign 做了什么呢讨韭?
????codesign 將 App 內(nèi)的資源(包括可執(zhí)行文件脂信、資源、文件透硝、嵌套代碼(Framework)等)在進(jìn)行一次數(shù)字簽名狰闪,通過單向散列函數(shù)獲得哈希值,并用開發(fā)者的私鑰 M 對其進(jìn)行加密濒生,并將蘋果服務(wù)器生成的數(shù)字證書一起保存至 App 內(nèi)埋泵。在 App 內(nèi)可能包含不同的數(shù)字簽名:
- 如果代碼是通用的,則每個(gè)切片(架構(gòu))的目標(biāo)代碼都是單獨(dú)簽名的峻凫。此簽名存儲在二進(jìn)制文件 Mach-O 本身中诞挨。
- 應(yīng)用程序包的各種數(shù)據(jù)組件(例如Info.plist文件李滴,如果有的話)也被簽名。這些簽名存儲在
_CodeSignature/CodeResources
捆綁包中調(diào)用的文件中雁社。 - 嵌入在應(yīng)用程序中的嵌套代碼(例如Framework)本身是經(jīng)過簽名的,并且它們的簽名也存儲在
_CodeSignature/CodeResources
包中晒骇。
App 安裝
????蘋果系統(tǒng)原本就持有 WWDRCA 的公鑰A歧胁,系統(tǒng)通過公鑰 A,對 App 內(nèi)存放的蘋果服務(wù)器簽名過的數(shù)字證書進(jìn)行驗(yàn)證厉碟,查看是否經(jīng)過蘋果官方許可喊巍,并對比 UUID 等信息,這里只驗(yàn)證安裝行為是否正確箍鼓。在通過證書內(nèi)的開發(fā)者公鑰對代碼簽名進(jìn)行驗(yàn)證崭参,這里驗(yàn)證代碼的完整性。