最近有朋友需要幫忙用公司企業(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)行