什么是代碼簽名
- 簽名: 確保被簽名文件的有效性
- 代碼簽名:iOS里的代碼簽名万哪,簡單概括就是用Mac上的私鑰,對(duì)app進(jìn)行一次簽名,確保app的完整闲先,防止別人篡改
回顧一下打包app的過程羞酗,要做哪些操作
Certificates:需要從證書頒發(fā)機(jī)構(gòu)CA那里創(chuàng)建一個(gè).certSigningRequest文件腐宋,這是使用非對(duì)稱加密創(chuàng)建的一對(duì)密鑰,私鑰存在Mac里整慎,公鑰就是.certSigningRequest要上傳到apple的開發(fā)者后臺(tái)脏款。apple用自己的私鑰對(duì).certSigningRequest文件進(jìn)行簽名生成.cer證書,把這個(gè).cer下載下來安裝到Mac上裤园,當(dāng)導(dǎo)出P12格式的證書時(shí)會(huì)把Mac的私鑰一起導(dǎo)出生成P12證書撤师。
Identifiers:創(chuàng)建app的Bundle ID,在創(chuàng)建appid的時(shí)候會(huì)勾選app用到的哪些權(quán)限拧揽,比如
Game Center剃盾、In-App Purchase、Sign In with Apple等淤袜。
Devices:需要調(diào)試設(shè)備的UDID
Profiles:根據(jù)Certificates痒谴、Identifiers、Devices生成的描述文件*.mobileprovision
展開mobileprovision可以看到描述文件里包含了Certificates證書铡羡、app ID和包含的Entitlements權(quán)限积蔚、Devices設(shè)備的UDID
在打包app的時(shí)候Xcode用證書和描述文件對(duì)app進(jìn)行了一次簽名。
為什么要重簽名
有時(shí)候在處理app的時(shí)候烦周,需要對(duì)app里面的資源進(jìn)行增刪改查的操作尽爆,例如更換啟動(dòng)圖,修改bundle读慎,修改動(dòng)態(tài)庫等漱贱,這會(huì)破壞原來打包app時(shí)候的簽名,導(dǎo)致app安裝失敗夭委,就是安裝的時(shí)候iOS的系統(tǒng)校驗(yàn)簽名失敗幅狮,需要重新簽名才可以安裝。
從上面可以知道描述文件里包含了Certificates株灸、Identifiers崇摄、Devices等信息,簽名的時(shí)候需要描述文件里包含的Certificates證書跟所簽名的P12證書信息一致才會(huì)簽名成功慌烧,但神奇的是并不需要描述文件里包含的app ID和工程里的app ID(info.plist里的Bundle ID)一致就可以簽名成功配猫,所以這也衍生出了超級(jí)簽、企業(yè)簽等應(yīng)用場(chǎng)景杏死,只要我有包含私鑰的P12證書和包含這個(gè)證書的描述文件泵肄,就可以給任意的app簽名捆交。
如何進(jìn)行重簽名
對(duì)app進(jìn)行重簽名,首先得有個(gè)app吧腐巢,使用Xcode打包出來的是ipa包品追,ipa包解壓出來的結(jié)構(gòu)是Payload/*.app
有app包之后,重簽名需要用到包含Mac私鑰的P12證書冯丙,包含證書肉瓦、app ID、device ID的描述文件.mobileprovision
把P12證書安裝到Mac上后胃惜,要獲取到這個(gè)證書的ID泞莉,以下命令可以查看電腦上所安裝的所有證書,找到對(duì)應(yīng)的證書ID船殉,使用證書ID或者證書名字都可以
$ security find-identity -v -p codesigning
1) C6C00376F3FAB3BFB33ECCE44D4698B1D5A4E293 "iPhone Distribution: CaiEn Rong (4Q3SJV59SN)"
把描述文件adhoc.mobileprovision拷貝到app的根路徑里鲫趁,名字改為embedded.mobileprovision,名字是固定寫法
$ cp adhoc.mobileprovision Payload/dis.app/embedded.mobileprovision
把描述文件adhoc.mobileprovision轉(zhuǎn)成.plist文件格式輸出利虫,方便后續(xù)獲取其中的權(quán)限列表
$ security cms -D -i adhoc.mobileprovision > entitlements_full.plist
截取描述文件中的權(quán)限文件挨厚,用于app的簽名
$ /usr/libexec/PlistBuddy -x -c 'Print:Entitlements' entitlements_full.plist > entitlements.plist
用前面獲取到的證書ID或者證書名字、描述文件里獲取到的權(quán)限列表對(duì)app進(jìn)行簽名
如果app內(nèi)包含了動(dòng)態(tài)庫糠惫,需要先對(duì)動(dòng)態(tài)庫進(jìn)行簽名疫剃,再對(duì)app簽名,區(qū)別是動(dòng)態(tài)庫的簽名不需要附加權(quán)限列表硼讽,動(dòng)態(tài)庫的路徑是Payload/*.app/Frameworks/*.framework巢价,以下是對(duì)動(dòng)態(tài)庫進(jìn)行簽名,如果app中沒有動(dòng)態(tài)庫固阁,可以跳過
$ /usr/bin/codesign --continue -f -s "iPhone Distribution: CaiEn Rong (4Q3SJV59SN)" Payload/*.app/Frameworks/*.framework
接著對(duì)app進(jìn)行簽名壤躲,以下命令
$ /usr/bin/codesign --continue -f -s "iPhone Distribution: CaiEn Rong (4Q3SJV59SN)" --entitlements "entitlements.plist" Payload/*.app
簽名完成后,可以校驗(yàn)一波簽名是否有效您炉,如果沒有任何輸出,這說明簽名有效役电,Unix的設(shè)計(jì)就是這樣赚爵,沒有輸出就是最好的輸出
$ codesign -v Payload/*.app
最后把Payload文件壓縮一波,改成ipa格式就可以使用了法瑟。