證書和簽名機(jī)制
數(shù)字簽名:實(shí)際上是非對(duì)稱加密+摘要算法(MD5或SHA1)。首先將文本通過(guò)摘要算法得到摘要,再用私鑰對(duì)摘要進(jìn)行加密得到密文,將源文本、密文、私鑰對(duì)應(yīng)的公鑰一并發(fā)布
作用:為了中途篡改文本內(nèi)容和保證文本的完整性,以及文本是指定的人發(fā)的
解密:用拿到的公鑰對(duì)密文解密,得到摘要A,再拿源文本通過(guò)摘要算法后得到的摘要B,若A==B,則沒(méi)有問(wèn)題
注意:有可能拿到的不是A發(fā)出的公鑰,可能是B、C、D偽造的公鑰,所以此時(shí)用到了數(shù)字證書
數(shù)字證書:CA機(jī)構(gòu)對(duì)A的公鑰做認(rèn)證,把公鑰和有效期等信息一起加密,生成數(shù)字證書。
解密:用CA機(jī)構(gòu)給的公鑰解開數(shù)字證書就可以拿到A的公鑰
之所以要申請(qǐng)證書,當(dāng)然是為了被驗(yàn)證。英語(yǔ)6級(jí)證書的驗(yàn)證方一般是用人單位;web應(yīng)用相關(guān)的SSL證書的驗(yàn)證方通常是瀏覽器;iOS各種證書的驗(yàn)證方是iOS設(shè)備。我們之所以必須從CA處申請(qǐng)證書,就是因?yàn)镃A已經(jīng)將整個(gè)驗(yàn)證過(guò)程規(guī)定好了。對(duì)于iOS,iOS系統(tǒng)已經(jīng)將這個(gè)驗(yàn)證過(guò)程固化在系統(tǒng)中了,除非越獄,否則無(wú)法繞過(guò)。
1)證書申請(qǐng):安裝蘋果根證書,讓開發(fā)工具信任CA機(jī)構(gòu)頒發(fā)的證書,從而可以用CA簽發(fā)的其他證書簽名和打包(一般安裝xcode會(huì)自動(dòng)安裝此證書到keychain)
2)提交申請(qǐng)者信息到蘋果會(huì)員中心里簽發(fā)證書,包括:
1-申請(qǐng)者信息用私鑰加密(私鑰保存在申請(qǐng)者里)
2-申請(qǐng)者公鑰
3-摘要算法和RSA加密
3)蘋果拿申請(qǐng)者信息里的公鑰和蘋果賬號(hào)信息封裝在證書中,進(jìn)行數(shù)字簽名;安裝完此證書后,keychain會(huì)自動(dòng)關(guān)聯(lián)我本地的私鑰和此證書包含的公鑰
4)后續(xù)真機(jī)過(guò)程里,會(huì)使用私鑰對(duì)代碼進(jìn)行簽名,打包進(jìn)APP。
注意:公鑰是會(huì)附帶在.mobileprovision描述文件中,但不是隨代碼打包的,是因?yàn)槲覀兯x的證書會(huì)對(duì)應(yīng)到私鑰,用于簽名的還是私鑰
5)將最初申請(qǐng)證書的機(jī)器的私鑰導(dǎo)出成.p12文件,并讓其他機(jī)器導(dǎo)入,同時(shí)其他機(jī)器也應(yīng)該安裝下載下來(lái)的證書,用于團(tuán)隊(duì)開發(fā)
6)mobileprovision文件包含:
AppId。每個(gè)app必須在MC中創(chuàng)建一個(gè)對(duì)應(yīng)的AppId。
使用哪些證書。不同類型的證書就代表了不同的發(fā)布方式,還包括一些功能的能否使用(比如APN:上架后使用蘋果推送服務(wù))
功能授權(quán)列表
可安裝的設(shè)備列表。對(duì)于AdHoc方式發(fā)布的app或者真機(jī)調(diào)試時(shí),會(huì)有一個(gè)列表,這個(gè)列表里面是iOS設(shè)備的UDID,每臺(tái)iOS設(shè)備出廠的UDID都不同,所以可以用來(lái)標(biāo)識(shí)設(shè)備。
蘋果的簽名
注意:AdHoc證書類型:允許將測(cè)試版app發(fā)布給有限的設(shè)備安裝,而無(wú)需通過(guò)appstore的審核。
ipa結(jié)構(gòu)
iOS程序最終都會(huì)以.ipa文件導(dǎo)出,先來(lái)了解一下ipa文件的結(jié)構(gòu):

事實(shí)上,ipa文件只是一個(gè)zip包,可以改后綴名為zip解壓
解壓后,得到上圖的Payload目錄,下面是個(gè)子目錄,其中的內(nèi)容如下:
資源文件,例如圖片、html、等等。
_CodeSignature/CodeResources。這是一個(gè)plist文件,可用文本查看,其中的內(nèi)容就是是程序包中(不包括Frameworks)所有文件的簽名。注意這里是所有文件。意味著你的程序一旦簽名,就不能更改其中任何的東西,包括資源文件和可執(zhí)行文件本身。iOS系統(tǒng)會(huì)檢查這些簽名。
可執(zhí)行文件。此文件跟資源文件一樣需要簽名。
一個(gè)mobileprovision文件.打包的時(shí)候使用的,從MC上生成的。
Frameworks。程序引用的非系統(tǒng)自帶的Frameworks,每個(gè)Frameworks其實(shí)就是一個(gè)app,其中的結(jié)構(gòu)應(yīng)該和app差不多,也包含簽名信息CodeResources文件
重簽名流程:
1、解壓ipa
2、通過(guò)命令行強(qiáng)制重簽.app目錄,codesign程序會(huì)自動(dòng)將其中的文件都簽名,(Frameworks不會(huì)自動(dòng)簽)
/user/bin/codesign -fs"iPhone Developer: Liang Ding (2U967A2YJ6)" --no-strict Payload/xxx.app
3、對(duì)于每個(gè)Framework,也需要使用這個(gè)命令簽名,并且替換描述文件.mobileprovision
4、使用zip命令重新打包成ipa包
iOS設(shè)備如何驗(yàn)證app是否合法:
解壓ipa
取出embedded.mobileprovision,通過(guò)簽名校驗(yàn)是否被篡改過(guò)
其中有幾個(gè)證書的公鑰,其中開發(fā)證書和發(fā)布證書用于校驗(yàn)簽名
BundleId
授權(quán)列表
校驗(yàn)所有文件的簽名,包括Frameworks
比對(duì)Info.plist里面的BundleId是否符合embedded.mobileprovision文件中的