原文地址:(代碼簽名)
最近看了objc.io上第17期中的文章 《Inside Code Signing》 對應(yīng)的中文翻譯版 《代碼簽名探析》 ,受益頗深,對iOS代碼簽名機制有了進一步的認識。想了解詳細內(nèi)容建議大家還是去看原文好了。
下面是對此文章的理解再結(jié)合自己之前對該部分的認識寫出的學(xué)習(xí)筆記。本文的前提是已經(jīng)對非對稱加密有了一定的了解。
一、數(shù)字簽名(digital signature)
對指定信息使用哈希算法,得到一個固定長度的信息摘要,然后再使用 私鑰 (注意必須是私鑰)對該摘要加密,就得到了數(shù)字簽名。所謂的代碼簽名就是這個意思。
二、數(shù)字證書(digital certificate)
- 證書生成
開 發(fā)者在申請iOS開發(fā)證書時,需要通過keychain生成一個CSR文件(Certificate Signing Request),提交給蘋果的 Apple Worldwide Developer Relations Certification Authority(WWDR)證書認證中心進行簽名,最后從蘋果官網(wǎng)下載并安裝使用。這個過程中還會產(chǎn)生一個私鑰。
- 證書組成
經(jīng)過WWDR數(shù)字簽名后的數(shù)字證書包含兩大部分:
1.證書本身
包含用戶的公鑰、用戶個人信息、證書頒發(fā)機構(gòu)信息、證書有效期等信息。
2.證書簽名
WWDR將上述證書本身內(nèi)容的使用哈希算法得到一個固定長度的信息摘要,然后使用自己的私鑰對該信息摘要加密生成數(shù)字簽名。
- 證書使用
iOS 系統(tǒng)原本就持有WWDR的公鑰,系統(tǒng)首先會對證書內(nèi)容通過指定的哈希算法計算得到一個信息摘要;然后使用WWDR的公鑰對證書中包含的數(shù)字簽名解密,從而 得到經(jīng)過WWDR的私鑰加密過的信息摘要;最后對比兩個信息摘要,如果內(nèi)容相同就說明該證書可信。
在驗證了證書是可信的以后,iOS系統(tǒng)就可以獲取到證書中包含的開發(fā)者的公鑰,并使用該公鑰來判斷代碼簽名的可用性了。
- 證書存在的意義
通過證書使用過程可以看出,證書本身只是一個中間媒介,iOS系統(tǒng)對證書并不關(guān)心,它其實只想要證書中包含的開發(fā)者的公鑰?。?/p>
- 但是開發(fā)者怎么才能證明公鑰是自己的呢?iOS安全系統(tǒng)怎么才能相信這個公鑰就是這個開發(fā)者的呢?
不 管是哪一個開發(fā)者對iOS的安全系統(tǒng)說,這個公鑰就是我的,系統(tǒng)是都不相信的,即系統(tǒng)對開發(fā)者有著百分之百的不信任感。但是iOS安全系統(tǒng)對自家的 WWDR是可信任的,蘋果將WWDR的公鑰內(nèi)置在了iOS系統(tǒng)中。有了證書,iOS安全系統(tǒng)只需要通過WWDR的公鑰就可以獲取到任何一個開發(fā)者的可信任 的公鑰了,這就是證書存在的意義??!
三、公鑰(public key)
公鑰被包含在數(shù)字證書里,數(shù)字證書又被包含在描述文件(Provisioning File)中,描述文件在應(yīng)用被安裝的時候會被拷貝到iOS設(shè)備中。
iOS安全系統(tǒng)通過證書就能夠確定開發(fā)者身份,就能夠通過從證書中獲取到的公鑰來驗證開發(fā)者用該公鑰對應(yīng)的私鑰簽名后的代碼、資源文件等有沒有被更改破壞,最終確定應(yīng)用能否合法的在iOS設(shè)備上合法運行。
四、私鑰(private key)
每個證書(其實是公鑰)都對應(yīng)有一個私鑰,
私鑰會被用來對代碼、資源文件等簽名。只有開發(fā)證書和描述文件是沒辦法正常調(diào)試的,因為沒有私鑰根本無法簽名。
此后的內(nèi)容基本都是從《代碼簽名探析》摘抄過來的筆記,建議大家看原文好了。