代碼簽名
什么是代碼簽名
????代碼簽名是對可執(zhí)行文件或腳本進(jìn)行數(shù)字簽名,用來確認(rèn)軟件的來源并保證在簽名后未被修改或損壞的措施。和數(shù)字簽名原理一樣,只不過簽名的數(shù)據(jù)是代碼而已.數(shù)字簽名使用非對稱加密和哈希函數(shù)來確保數(shù)據(jù)的完整性,可以用于識別和驗(yàn)證簽名者。
代碼簽名的好處
- 確保一段代碼自簽名后未被更改。系統(tǒng)甚至可以檢測到最小的更改,無論是有意的(例如惡意攻擊者)還是意外的(例如文件損壞時)。當(dāng)代碼簽名完好無損時,系統(tǒng)可以確定代碼與簽名者的預(yù)期相符。
- 將代碼標(biāo)識為來自特定來源(開發(fā)人員或簽名者)。代碼簽名包括明確指向特定作者的密碼信息。
- 確定代碼對于特定目的是否值得信賴。除此之外,開發(fā)人員可以使用代碼簽名來聲明應(yīng)用程序的更新版本應(yīng)被系統(tǒng)視為與先前版本相同的應(yīng)用程序。
蘋果簽名過程
證書和密鑰
-
CSR
文件
????通常,在開發(fā)使用的機(jī)器上應(yīng)該已經(jīng)有一個開發(fā)者證書,一個公鑰,以及一個私鑰。 這些是代碼簽名機(jī)制的核心。像 SSL 一樣,代碼簽名也依賴于采用 X.509 標(biāo)準(zhǔn)的公開密鑰加密。開發(fā)者通過 Key Chain 生成 CertificateSigningRequest(證書請求文件) 文件,這個文件里面包含了開發(fā)者的個人信息和公鑰,并且在申請時私鑰保存在本地。
CSR文件 -
CER
文件
????開發(fā)者將 CSR 文件上傳至蘋果網(wǎng)站提交給 Apple Worldwide Developer Relations Certification Authority(Apple WWDRCA)。Apple WWDRCA 會使用其根證書私鑰簽名生成了.cer
證書文件,這個證書里面包含了開發(fā)者的信息和公鑰,以及數(shù)字簽名。????在 OS X 上,X.509 的基本組成部分(例如證書等)都是由一個叫Key chain(鑰匙串訪問)的工具來進(jìn)行管理。當(dāng)下載 CER 文件安裝至鑰匙串時,鑰匙串會將這兩個證書進(jìn)行關(guān)聯(lián),要用一個證書設(shè)置代碼簽名,必須擁有私鑰,所有證書的私鑰都會被列在這里。 還有一種可以用來快速地顯示出系統(tǒng)中能用來對代碼進(jìn)行簽名的認(rèn)證的方法,那就是利用用途廣泛的命令行工具 security:
security find-identity -v -p codesigning
P12
文件
????當(dāng) CER 安裝到鑰匙串中,開發(fā)者將其導(dǎo)出為.P12
格式的文件,這個文件中不僅包含了公鑰信息,還有私鑰信息,以及數(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ò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)證代碼的完整性。