iOS數(shù)字簽名及ipa重簽名

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ì)比,如果相等那么文本正常,否則文本無效。

screenshot.png
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)起來。

screenshot.png
配置文件

配置文件包含信息:

  • App ID。
  • 使用了哪些證書。不同種類發(fā)布方式的證書和推送證書APN等。
  • 功能授權(quán)列表。
  • 可安裝的設(shè)備列表。
  • 蘋果的簽名!

其中蘋果的簽名是蘋果簽的,和我們的私鑰沒有關(guān)系。因此配置文件只能從MC獲取,且獲取后無法修改。蘋果通過配置文件限制了前面四項(xiàng)內(nèi)容,從而將控制權(quán)牢牢的抓在手中。

ipa的組成

ipa解壓后,得到Payload目錄,其中的內(nèi)容如下:

screenshot.png

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)。

1.代碼簽名探析
2.漫談iOS程序的證書和簽名機(jī)制
3.Inside Code Signing

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 接觸iOS開發(fā)多年,花了一點(diǎn)時(shí)間去研究了一下iOS這套證書和簽名機(jī)制,并撰文分享給需要的朋友。由于本人才疏學(xué)淺,多...
    風(fēng)和花閱讀 2,010評(píng)論 0 7
  • 非對(duì)稱加密和摘要非對(duì)稱加密的特性和用法非對(duì)稱加密算法可能是世界上最重要的算法,它是當(dāng)今電子商務(wù)等領(lǐng)域的基石。簡(jiǎn)而言...
    哈哈哈我的簡(jiǎn)書賬號(hào)閱讀 1,360評(píng)論 1 5
  • 從事iOS開發(fā)三年了,日常的精力主要放在公司的業(yè)務(wù)上,最近決定開始寫一些技術(shù)方面的東西,記錄自己今后的學(xué)習(xí)歷程,也...
    差一點(diǎn)不是帥哥閱讀 1,826評(píng)論 0 8
  • 我死了化作塵土 土之上開出野花 花之上一片晴空 空之上便是天堂 天堂里肯定沒我 這是最悲傷的
    世界很涼閱讀 271評(píng)論 0 0
  • 十余載光陰,倏忽而過。 從八歲那年離開故鄉(xiāng)至今,已有十四年之久。故鄉(xiāng)的人和事已淡出我生命多年。而那些模糊的記憶卻...
    小橋屋檐閱讀 472評(píng)論 8 5

友情鏈接更多精彩內(nèi)容