ipa重簽名是指對(duì)已經(jīng)打包好的ipa,利用新的證書重新簽名。
ipa重簽名作用:
作用一:
有時(shí)候公司在進(jìn)行軟件開發(fā)的時(shí)候, 發(fā)布軟件初期使用的是個(gè)人賬號(hào)或者是公司賬號(hào),但是因?yàn)槟撤N需要要使用企業(yè)賬號(hào)進(jìn)行分發(fā)這個(gè)應(yīng)用,但是這時(shí)候可能出現(xiàn)一個(gè)問題就是不能再次使用原來的Bundle ID了,蘋果規(guī)定Bundle ID必須是唯一的,更換Bundle ID就可以解決問題。但是新的問題就出現(xiàn)了,因?yàn)樵鹊奈⒉?、統(tǒng)計(jì)、以及推送的功能就失效了,這樣又要重新配置新的BundleId,而且會(huì)對(duì)以前的版本造成影響。這時(shí)候就要使用到ipa重簽解決問題了。
作用二:
手機(jī)不想越獄,但是又想使用App Store上面的收費(fèi)軟件,我們?nèi)绾谓鉀Q呢?其實(shí)很多蘋果助手就是用企業(yè)證書把App重簽提供下載的。作為iOS開發(fā)者的我們,也可以使用自己的證書進(jìn)行重簽,以測(cè)試的身份使用App。
重簽名原理
數(shù)字簽名使用了非對(duì)稱加密和摘要算法的結(jié)合。假設(shè)有一段原文本需要發(fā)布,為了防止中途文本類容被篡改,保證文本的完整性以及文本是由指定機(jī)構(gòu)發(fā)的。首先,將原文本內(nèi)容通過摘要算法,得到摘要,在用指定機(jī)構(gòu)的私鑰對(duì)摘要進(jìn)行加密得到密文,加原文本、密文和私鑰對(duì)應(yīng)的公鑰一并發(fā)布。當(dāng)驗(yàn)證方拿到這些信息后,首先驗(yàn)證公鑰是不是指定機(jī)構(gòu)的,然后用公鑰對(duì)密文進(jìn)行解密得到摘要,將原文本內(nèi)容用同樣的摘要算法得到摘要,兩個(gè)摘要進(jìn)行對(duì)比,如果相等那么文本正常,否則文本無效。

CertificateSigningRequest.certSigningRequest
我們生成開發(fā)者證書的第一步是開發(fā)者在KeyChain中生成一個(gè)證書申請(qǐng)文件(CSR),該文件包含信息:
- 申請(qǐng)者的信息,此信息使用申請(qǐng)者的私鑰加密的
- 申請(qǐng)者公鑰,此信息是申請(qǐng)者使用的私鑰對(duì)應(yīng)的公鑰
- 摘要算法(SHA1)和公鑰加密算法(RSA)
開發(fā)者證書
蘋果去除CSR中的公鑰,不管我的其他信息,將我MemberCenter(MC)中的賬號(hào)信息和我提交的公鑰封裝在證書中,并進(jìn)行數(shù)字簽名(由蘋果的認(rèn)證部門 Apple Worldwide Developer Relations CA簽名)。當(dāng)我們下載證書并安裝后,KeyChain會(huì)自動(dòng)將這對(duì)密鑰關(guān)聯(lián)起來。

配置文件
配置文件包含信息:
- App ID。
- 使用了哪些證書。不同種類發(fā)布方式的證書和推送證書APN等。
- 功能授權(quán)列表。
- 可安裝的設(shè)備列表。
- 蘋果的簽名!
其中蘋果的簽名是蘋果簽的,和我們的私鑰沒有關(guān)系。因此配置文件只能從MC獲取,且獲取后無法修改。蘋果通過配置文件限制了前面四項(xiàng)內(nèi)容,從而將控制權(quán)牢牢的抓在手中。
ipa的組成
ipa解壓后,得到Payload目錄,其中的內(nèi)容如下:

1.資源文件。例如圖片、html等。
2._CodeSignature/CodeResources。這是一個(gè)plist文件,可用文本查看,其中的內(nèi)容就是是程序包中(不包括Frameworks)所有文件的簽名。注意這里是所有文件。意味著你的程序一旦簽名,就不能更改其中任何的東西,包括資源文件和可執(zhí)行文件本身。iOS系統(tǒng)會(huì)檢查這些簽名。
3.app??蓤?zhí)行文件。此文件跟資源文件一樣需要簽名。
4.embedded mobileprovision。打包時(shí)候使用的,從MC上生成的。
5.Frameworks。程序引用的非系統(tǒng)自帶的Frameworks,每個(gè)Frameworks其實(shí)就是一個(gè)app,其中的結(jié)構(gòu)應(yīng)該和app差不多,也包含簽名信息CodeResources文件。
Xcode構(gòu)建過程中,使用簽名的重要過程就是通過codesign命令行工具對(duì)工程文件進(jìn)行私鑰加密。
iOS設(shè)備如何驗(yàn)證app是否合法
關(guān)鍵步驟:
1.解壓ipa。
2.取出embedded mobileprovision,通過簽名校驗(yàn)是否被篡改過。包括幾個(gè)證書中的公鑰、BundleID、App ID、功能列表、設(shè)備列表等等。
3.校驗(yàn)所有文件的簽名,包括Frameworks。
4.比對(duì)Info.plist文件里面的BundleID是否符合embedded mobileprovision文件中的。
ipa重簽名的流程
大致步驟:
1.解壓ipa。
2.如果存在Frameworks子目錄,則對(duì).app文件夾下的所有Frameworks進(jìn)行簽名,在Frameworks文件夾下的.dylib或.framework。
3.對(duì)xxx.app簽名。
4.重新打包。
重簽名具體步驟
主要是替換ipa包里面的_CodeSignature和embedded.mobileprovision兩個(gè)文件,以及entitlements.plist授權(quán)文件。
1.解壓ipa安裝包
cp olinone.ipa olinone.zip
2、替換證書配置文件(文件名必須為embedded,不得自定義)
cp embedded.mobileprovision Payload/olinone.app
3、重簽名(certifierName為重簽名證書文件名,可以加證書ID后綴)
certifierName="iPhone Distribution: olinone Information Technology Limited(6a5TVN58SY)"
codesign -f -s $certifierName --entitlements entitlements.plist Payload/olinone.app
4、打包
zip -r olinone.ipa Payload
ipa表示是證書ID + BundleID,只有兩者完全匹配,安裝包才能覆蓋安裝,否則就會(huì)提示安裝失敗。解決辦法就是卸載安裝包,重新安裝!
還可以使用iReSign工具重簽名(https://github.com/maciekish/iReSign)。