iOS簽名
iOS開發(fā)時(shí)真機(jī)測(cè)試、AdHoc、應(yīng)用上架,我們都需要先到官網(wǎng)下載證書。這一過(guò)程其實(shí)就是iOS簽名機(jī)制。這一過(guò)程保證了每一個(gè)安裝到iOS平臺(tái)的應(yīng)用都是蘋果允許的。
數(shù)字簽名
數(shù)字簽名主要是根據(jù)非對(duì)稱算法實(shí)現(xiàn)的,對(duì)稱加密是通過(guò)同一份密鑰加密和解密數(shù)據(jù),而非對(duì)稱加密則有兩份密鑰,分別是公鑰和私鑰,用公鑰加密的數(shù)據(jù),要用私鑰才能解密,用私鑰加密的數(shù)據(jù),要用公鑰才能解密。
數(shù)字簽名作用是當(dāng)我對(duì)數(shù)據(jù)打了一個(gè)標(biāo)記,表示我認(rèn)可了這份數(shù)據(jù)(簽了個(gè)名),然后我發(fā)送給其他人,其他人可以知道這份數(shù)據(jù)是經(jīng)過(guò)我認(rèn)證的,數(shù)據(jù)沒(méi)有被篡改過(guò)。
- 首先用一種算法計(jì)算出原始數(shù)據(jù)的摘要。摘要一般滿足a.原始數(shù)據(jù)變化,摘要也要變化。b.摘要要足夠短。一般使用MD5算法。
- 生成一份非對(duì)稱加密的公鑰私鑰,私鑰自己拿著,公鑰發(fā)布出去。
- 用私鑰將摘要進(jìn)行加密,作為原始數(shù)據(jù)的簽名。將原始數(shù)據(jù)和簽名一起發(fā)送給客戶。
- 用戶收到數(shù)據(jù)后,將簽名通過(guò)公鑰解密得到摘要。數(shù)據(jù)通過(guò)同樣算法加密得到摘要,判斷摘要是否相等,來(lái)確定數(shù)據(jù)是否被篡改。
iOS 簽名
最簡(jiǎn)單的簽名
最簡(jiǎn)單的簽名方式為,蘋果生成公鑰和私鑰,私鑰放到蘋果后臺(tái),iOS內(nèi)置公鑰。App上傳到App Store時(shí),蘋果后臺(tái)用私鑰對(duì)App進(jìn)行數(shù)字簽名,iOS設(shè)備下載App時(shí),用公鑰驗(yàn)證簽名,如果App是通過(guò)蘋果后臺(tái)認(rèn)證的則安裝。
但是實(shí)際上除了App Store安裝app,我們還可以通過(guò)3種方式安裝:
- 開發(fā) App 時(shí)可以直接把開發(fā)中的應(yīng)用安裝進(jìn)手機(jī)進(jìn)行調(diào)試。
- In-House 企業(yè)內(nèi)部分發(fā),可以直接安裝企業(yè)證書簽名后的 APP。
- AD-Hoc 相當(dāng)于企業(yè)分發(fā)的限制版,限制安裝設(shè)備數(shù)量,較少用。
蘋果要對(duì)這三種方式安裝的App進(jìn)行控制,上面的方式就無(wú)法實(shí)現(xiàn)了。
開發(fā)App時(shí)應(yīng)用安裝 簽名流程
- Mac電腦上生成一對(duì)公鑰私鑰,這里稱為公鑰L、私鑰L
- 蘋果固有的一對(duì)公鑰私鑰,iOS設(shè)備內(nèi)置公鑰A,蘋果后臺(tái)保存私鑰A
- 公鑰L上傳到Apple后臺(tái),通過(guò)蘋果后臺(tái)私鑰A對(duì)其進(jìn)行簽名,得到一份數(shù)據(jù)包含公鑰L和它的簽名,稱為證書
- 在Apple后臺(tái)申請(qǐng)AppID、設(shè)備ID、App使用權(quán)限,和3的證書一起,通過(guò)私鑰A簽名,將數(shù)據(jù)和簽名組成Provisioning Profile(描述文件),下載到mac。
- 開發(fā)時(shí)編譯完App,會(huì)通過(guò)本地的私鑰L對(duì)App進(jìn)行簽名,同時(shí)把描述文件打包放到App中,文件名為 embedded.mobileprovision,把 App 安裝到手機(jī)上。
- 安裝時(shí),iOS系統(tǒng)取到證書,通過(guò)內(nèi)置的公鑰A,驗(yàn)證embedde zded.mobileprovisions的數(shù)字簽名是否正確。
- 確保了數(shù)據(jù)是蘋果授權(quán),取出里面的數(shù)據(jù),驗(yàn)證App簽名、設(shè)備ID是否在列表上,AppID是否對(duì)應(yīng),權(quán)限開關(guān)是否對(duì)應(yīng)。
對(duì)應(yīng)操作
- 第1步對(duì)應(yīng)就是從keychain中“從證書頒發(fā)機(jī)構(gòu)請(qǐng)求證書”,生成了本地的公鑰私鑰,保存的CertificateSigningRequest是公鑰,私鑰保存在電腦本地。
- 第2步是蘋果自己處理的
- 第3步對(duì)應(yīng)是將CertificateSigningRequest上傳到蘋果后臺(tái)生成證書,并下載到本地。
此時(shí)本地有兩個(gè)證書,一個(gè)是第1步生成包含私鑰的證書,另一個(gè)是剛下載的證書,keychain將兩個(gè)證書關(guān)聯(lián)起來(lái),因?yàn)樗麄児€和私鑰是對(duì)應(yīng)的。從Xcode中選擇證書是,實(shí)際上是通過(guò)keychain里對(duì)應(yīng)的私鑰去簽名。這個(gè)私鑰只有生成它的Mac中有,如果其他Mac也想要編譯簽名這個(gè)App的話,可以把私鑰導(dǎo)出給其他Mac用,從keychain導(dǎo)出.p12文件,其他Mac打開就導(dǎo)入了這個(gè)私鑰。
- 第4步,在蘋果官網(wǎng)上操作,配置AppID/權(quán)限/設(shè)備等,最后下載描述文件
- 第5步Xcode通過(guò)第3步下載回來(lái)的證書(公鑰),在本地找到對(duì)應(yīng)的私鑰,用本地的私鑰簽名App,并把描述文件命名為embedded.mobileprovision一起打包進(jìn)去。這里對(duì)App的簽名數(shù)據(jù)保存分2部分,Mach-O會(huì)把簽名直接寫到文件中,其他資源文件則會(huì)保存在 _CodeSignature 目錄下。
- 6-7步是系統(tǒng)做的事
- 證書:公鑰L和簽名
- Entitlements:App權(quán)限
- CertificateSigningRequest:本地公鑰L
- p12:本地私鑰,可導(dǎo)入其他電腦
- Provisioning Profile:包含了證書、 Entitlements等數(shù)據(jù),蘋果后臺(tái)私鑰簽名的數(shù)據(jù)包
App Store
App發(fā)布到App Store的簽名驗(yàn)證方式和上述不同,最簡(jiǎn)單的簽名方式就可以滿足。事實(shí)上下載一個(gè)App Store的安裝包,里面不包含embedded.mobileprovision文件的,它并不依賴這個(gè)文件。
上傳到App Store的包蘋果會(huì)重新對(duì)內(nèi)容加密,原來(lái)本地的私鑰簽名就沒(méi)用了。AppStore下載的包,蘋果也不打算控制它的有限期,所以直接在蘋果后臺(tái)的私鑰簽名,iOS設(shè)備中公鑰驗(yàn)證就可以了。
為什么還要一樣弄證書和描述文件呢?猜測(cè)因?yàn)橄虢y(tǒng)一管理,描述文件中包含一個(gè)權(quán)限控制,AppID校驗(yàn)。蘋果不想上傳是重新用另一種協(xié)議驗(yàn)證,不如統(tǒng)一放到描述文件中,上傳到App Store時(shí)只要用同樣流程驗(yàn)證描述文件是否合法即可。
所以App上傳到App Store后,和證書、描述文件無(wú)關(guān),他們不會(huì)影響已經(jīng)上線的App。