了解 APP 應(yīng)用簽名

代碼簽名

什么是代碼簽名

????代碼簽名是對可執(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)用程序余佛。

蘋果簽名過程

證書和密鑰

  1. 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í)私鑰保存在本地钥组。

    CSR文件

  2. 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  
    
  3. P12 文件
    ????當(dāng) CER 安裝到鑰匙串中影暴,開發(fā)者將其導(dǎo)出為 .P12 格式的文件,這個(gè)文件中不僅包含了公鑰信息探赫,還有私鑰信息型宙,以及數(shù)字簽名

申請開發(fā)證書的流程

授權(quán)機(jī)制(Entitlements) 和 配置文件 (Provisioning)

????蘋果對 App 的 部分功能設(shè)定了權(quán)限開關(guān)伦吠,把這些權(quán)限開關(guān)統(tǒng)一稱為 Entitlements(授權(quán)文件)妆兑,并且對安裝的設(shè)備(Device)做了限制,需要注冊的設(shè)備才可以 安裝毛仪,將AppId搁嗓、DeviceEntitlements以及其他信息保存到了 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包中晒骇。
code_signing

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)證代碼的完整性。


鑰匙串-系統(tǒng)-Apple WWDRCA
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末款咖,一起剝皮案震驚了整個(gè)濱河市何暮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌铐殃,老刑警劉巖海洼,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異富腊,居然都是意外死亡坏逢,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來是整,“玉大人肖揣,你說我怎么就攤上這事「∪耄” “怎么了龙优?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長事秀。 經(jīng)常有香客問我彤断,道長,這世上最難降的妖魔是什么易迹? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任瓦糟,我火速辦了婚禮,結(jié)果婚禮上赴蝇,老公的妹妹穿的比我還像新娘菩浙。我一直安慰自己,他們只是感情好句伶,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布劲蜻。 她就那樣靜靜地躺著,像睡著了一般考余。 火紅的嫁衣襯著肌膚如雪先嬉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天楚堤,我揣著相機(jī)與錄音疫蔓,去河邊找鬼。 笑死身冬,一個(gè)胖子當(dāng)著我的面吹牛衅胀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播酥筝,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼滚躯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了嘿歌?” 一聲冷哼從身側(cè)響起掸掏,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宙帝,沒想到半個(gè)月后丧凤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡步脓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年愿待,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了浩螺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡呼盆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蚁廓,到底是詐尸還是另有隱情访圃,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布相嵌,位于F島的核電站腿时,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏饭宾。R本人自食惡果不足惜批糟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望看铆。 院中可真熱鬧徽鼎,春花似錦、人聲如沸弹惦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽棠隐。三九已至石抡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間助泽,已是汗流浹背啰扛。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嗡贺,地道東北人隐解。 一個(gè)月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像诫睬,于是被迫代替她去往敵國和親厢漩。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容