最近有朋友需要幫忙用公司企業(yè)證書打包企業(yè)內(nèi)側(cè)應(yīng)用光涂,經(jīng)過本人搜集、采坑嗤栓,目前最簡單、可靠地重簽名解決方案(企業(yè)證書可非企業(yè)證書均可)箍邮,分享給需要的童鞋茉帅。
首先感謝醉雨清風(fēng)無私奉獻(xiàn),下面廢話少說直接開擼
現(xiàn)在主流的重簽名有兩種:
1. 完全重簽名(更改Bundle ID)
證書锭弊,mobileprovision堪澎、Bundle ID三者信息對應(yīng)一致,這種重簽名方式基本上與直接對代碼進(jìn)行簽名的效果是一樣的;
優(yōu)點(diǎn):有效期長味滞、穩(wěn)定性高樱蛤;
缺點(diǎn):維護(hù)成本較高,每一個(gè)重簽名的ipa都必須修改Bundle ID并且獨(dú)享一套證書和mobileprovision文件桃犬;
適用范圍:對簽名效果穩(wěn)定性有要求的公司和團(tuán)隊(duì)刹悴;
不完全重簽名(不更改Bundle ID)
只保證證書和mobileprovision對應(yīng)一致,至于這兩者與原ipa的Bundle ID等信息是否一致則不考慮攒暇;
優(yōu)點(diǎn):看起來較方便維護(hù)土匀;
缺點(diǎn):實(shí)際上并沒有對原ipa的簽名進(jìn)行完全替換,很容易重簽名失敗形用,穩(wěn)定性不高就轧,多則一兩個(gè)月,少則三五天就可能發(fā)生簽名失效田度,需要重新簽名妒御,慎用!镇饺!
適用范圍:市面上出售企業(yè)證書進(jìn)行重簽名的個(gè)人賣家乎莉;
下面詳細(xì)說下重簽名相關(guān)的知識以及這兩種重簽名的方法,大家一起學(xué)習(xí)探討奸笤。
在了解重簽名之前惋啃,我們先要了解下iOS 簽名機(jī)制以及作用
簽名機(jī)制的目的
在 iOS 出來之前,在主流操作系統(tǒng)(Mac/Windows/Linux)上開發(fā)和運(yùn)行軟件是不需要簽名的监右,軟件隨便從哪里下載都能運(yùn)行边灭,導(dǎo)致平臺對第三方軟件難以控制,盜版流行健盒。蘋果希望解決這樣的問題绒瘦,在 iOS 平臺對第三方 APP 有絕對的控制權(quán)称簿,一定要保證每一個(gè)安裝到 iOS 上的 APP 都是經(jīng)過蘋果官方允許的,怎樣保證呢惰帽?就是通過簽名機(jī)制憨降。
簽名機(jī)制的實(shí)現(xiàn)
說到簽名機(jī)制的實(shí)現(xiàn),就不得不提各種證書善茎、mobileprovision券册、Entitlements频轿、CertificateSigningRequest垂涯、p12、AppID這些概念性的東西每一個(gè)拿出來說都是需要很大篇幅的航邢,我們在這里不講概念耕赘,就簡單說下他們是如何來實(shí)現(xiàn)IPA簽名的功能的。
iOS簽名主要用到的有證書和mobileprovision這兩個(gè)文件膳殷,其他文件(CertificateSigningRequest操骡、AppID)都是為了生成這兩種文件而存在,或者是這兩種文件在的衍生文件(P12赚窃、Entitlements)册招,當(dāng)簽名代碼時(shí),會將證書文件勒极、mobileprovision一起寫入是掰,同時(shí)為了管控APP 的其他權(quán)限,Xcode 會生成Entitlements文件,這些文件辱匿、資源和代碼最終都會以ipa文件的形式導(dǎo)出
通過解壓ipa文件的結(jié)構(gòu)也可以看出一些問題:
ipa內(nèi)部文件結(jié)構(gòu)
資源文件:例如圖片键痛、html、等等匾七。
CodeSignature/CodeResources:這是一個(gè)plist文件絮短,可用文本查看,其中的內(nèi)容就是是程序包中(不包括Frameworks)所有文件的簽名昨忆。注意這里是所有文件丁频。意味著你的程序一旦簽名,就不能更改其中任何的東西邑贴,包括資源文件和可執(zhí)行文件本身席里。iOS系統(tǒng)會檢查這些簽名;
可執(zhí)行文件:此文件跟資源文件一樣需要簽名痢缎;
mobileprovision:次文件用來校驗(yàn)證書文件胁勺、Bundle ID、独旷,從MC上生成的署穗。
Frameworks:程序引用的非系統(tǒng)自帶的Frameworks寥裂,每個(gè)Frameworks其實(shí)就是一個(gè)app,其中的結(jié)構(gòu)應(yīng)該和app差不多案疲,也包含簽名信息CodeResources文件
上述這些文件組合在一起封恰,共同實(shí)現(xiàn)了ipa的簽名功能。
了解了簽名原理褐啡,我們再來了解下iOS系統(tǒng)驗(yàn)證簽名有效性的過程诺舔,只有了解這個(gè)過程才能更好的重簽名
iOS 系統(tǒng)驗(yàn)證簽名有效性的過程
iOS 系統(tǒng)驗(yàn)證簽名有效性的過程
解壓ipa;
取出embedded.mobileprovision备畦,通過簽名校驗(yàn)是否被篡改過低飒;
校驗(yàn)所有文件的簽名,包括Frameworks;
驗(yàn)證授權(quán)設(shè)備是否符合embedded.mobileprovision文件中的信息;
比對Info.plist里面的BundleId是否符合embedded.mobileprovision文件中的信息;
簽名和驗(yàn)證簽名的原理都了解了懂盐,接下來我們就可以對癥下藥褥赊,進(jìn)行重簽名
重簽名的實(shí)現(xiàn)
既然簽名是由證書和mobileprovision共同實(shí)現(xiàn),那么重簽名的過程其實(shí)就是將新的證書和mobileprovision替換舊文件的過程莉恼,但由于系統(tǒng)在驗(yàn)證app是否合法的時(shí)候還會隨機(jī)驗(yàn)證授權(quán)設(shè)備列表和Bundle ID拌喉、所以必須修改Bundle ID與新的mobileprovision中的信息保持一致,否則將會有驗(yàn)證失敗的風(fēng)險(xiǎn)俐银。
完全重簽名就是采用完全替換的方式尿背,所以在面對Apple的合法性校驗(yàn)的時(shí)候,不會有任何問題捶惜;
不完全重簽名由于忽視了Bundle ID校驗(yàn)這一環(huán)節(jié)田藐,簽名不穩(wěn)定,有效期很短售躁!
重簽名的操作
完全重簽名
完全重簽名現(xiàn)在很多工具都可以實(shí)現(xiàn)了坞淮,我們公司用到的是Fastlane中的resign功能,我這邊介紹一種更輕量級的GUI工具iReSign陪捷,使用非常簡單回窘,一張圖即可說明。
iReSign使用說明
注意:選擇重簽名的描述文件和重簽名的證書文件時(shí)市袖,一定要配套啡直,同時(shí)一定要勾選修改ID,并將App ID修改為與重簽名的描述文件中的APP ID 一致苍碟,切記酒觅!
2. 不完全重簽名
不完全重簽名的方式需要用到一種比較老的工具iOS_resign_scripts
這個(gè)工具提供三種重簽名的腳本,但是據(jù)我個(gè)人血淚踩坑微峰,只有舷丹。。第三種方式有效蜓肆,前兩種已經(jīng)失效了颜凯。谋币。。
方法:
將重簽名腳本ios_resign_with_ipa和 要重簽名的ipa症概、mobileprovision放入同一個(gè)文件夾蕾额;
cd 到文件夾中
執(zhí)行代碼
$shios_resign_with_ipa$source_ipa_file$Developer_code_sign$mobileprovision$target_app_related_path
注意:source_ipa_file待重簽名的ipa名稱。target_app_related_path重簽名后ipa的名稱$Developer_code_sign用到的證書名稱彼城。$mobileprovision描述文件名稱
Example:
$shios_resign_with_ipa Testerhome.ipa"iPhone Developer: hengjie chen (XXXXXXXX)"embedded.mobileprovision Testerhome-resigned.ipa
成功之后诅蝶,上傳重簽名過的ipa安裝可以完美運(yùn)行