1眼刃、簡(jiǎn)介
利用Xcode的命令 security
和 codesign
重簽ipa文件破托。重簽名與Xcode里用build打包時(shí)進(jìn)行的簽名操作是一個(gè)原理颊乘,具體來說,先了解一下iOS相關(guān)的證書類型腊脱。
證書類型:
證書類型 | 使用場(chǎng)景 |
---|---|
開發(fā)(Development)證書和描述文件 | 用于開發(fā)測(cè)試访得,在Xcode中打包后,可在真機(jī)環(huán)境調(diào)試陕凹、安裝 |
發(fā)布(Distribution)證書和描述文件 | 用于提交Appstore悍抑,在Xcode中打包后,可使用Xcode杜耙、Application Loader提交到Appstore審核發(fā)布 |
證書作用:
證書 | 文件后綴 | 文件類型 | 作用 |
---|---|---|---|
Provisioning Profile | .mobileprovision | 描述文件 | Provisioning Profiles文件(配置文件)搜骡, 作用是綁定設(shè)備UDID,所以在申請(qǐng)開發(fā)描述文件之前佑女,先添加調(diào)試的設(shè)備记靡。雙擊時(shí)打開Xcode安裝在電腦上的描述文件谈竿,用命令行可以查看安裝的描述文件,可以過濾掉過期的描述文件摸吠。 |
Signing Certificate | .cer/.p12 | 證書文件 | 有開發(fā)和發(fā)布的證書榕订,可以在鑰匙串查看安裝的可用的證書,過期時(shí)間等蜕便。p12是一個(gè)加密的文件,只要知道其密碼贩幻,就可以供給所有的 Mac 設(shè)備使用轿腺,是這個(gè)應(yīng)用的唯一標(biāo)識(shí)證書和開發(fā)者,用于對(duì)應(yīng) bundleID 的應(yīng)用開發(fā)和打包測(cè)試丛楚。 |
注:
- 描述文件保存在 macOS 路徑:
~/Library/MobileDevice/Provisioning\ Profiles/
- 查看安裝的證書使用命令:
security find-identity -p codesigning -v
如果是團(tuán)隊(duì)開發(fā)族壳,一般會(huì)生成p12證書提供給組員使用,這樣更加好管理證書趣些。
證書名字 | 用途 |
---|---|
adhocXXX.mobileprovision | 描述文件仿荆。用于生成 adhoc 包時(shí),描述可以安裝ipa包的設(shè)備UDID和證書關(guān)系坏平。(包含推送拢操、apple pay等權(quán)限聲明內(nèi)容) |
devXXX.mobileprovision | 描述文件。用于生成 dev 包時(shí)舶替,描述可以安裝ipa包的設(shè)備UDID和證書關(guān)系令境。(包含推送、apple pay等權(quán)限聲明內(nèi)容) |
devXXXPushXXX.p12 | 推送證書顾瞪。用于 dev 包推送時(shí)舔庶,認(rèn)證和關(guān)聯(lián) 應(yīng)用bundleID 的證書關(guān)系。 |
devXXX.p12 | 開發(fā)證書陈醒。用于打包App時(shí)惕橙,生成 dev 的 ipa 包需要的開發(fā)者信息。 |
disXXX.mobileprovision | 描述文件钉跷。用于生成 dis 包時(shí)弥鹦,描述應(yīng)用bundleID與證書的關(guān)系。(包含推送爷辙、apple pay等權(quán)限聲明內(nèi)容) |
disXXXPushXXX.p12 | 推送證書惶凝。用于 dis(或adhoc) 包推送時(shí),認(rèn)證和關(guān)聯(lián) 應(yīng)用bundleID 的證書關(guān)系犬钢。 |
disXXX.p12 | 發(fā)布證書苍鲜。用于打包App時(shí),生成 dis (或adhoc) 的 ipa 包需要的開發(fā)者信息玷犹。 |
注:
- 如果需要添加新的設(shè)備UDID混滔,其實(shí)只需要更新 .mobileprovision 描述文件就可以洒疚;
- 如果證書超過了有效期,.p12 和 .mobileprovision 文件需要重新生成坯屿,如果 revoke 生成新的證書油湖,舊的證書和證書對(duì)應(yīng)的ipa包不能再安裝在設(shè)備上。
關(guān)于證書類型說明:
用途 | dev | adhoc | dis | 企業(yè)證書 |
---|---|---|---|---|
能否用于送審 | 不能 | 能 | 能 | 不能 |
不越獄且不添加到證書的設(shè)備能否安裝 | 不能 | 不能 | 不能 | 能 |
不越獄但添加到證書的設(shè)備能否安裝 | 能 | 能 | 不能 | 能 |
越獄設(shè)備能否安裝 | 能 | 能 | 能 | 能 |
能否用于沙盒儲(chǔ)值測(cè)試 | 能 | 能 | 不能 | 不能 |
越獄設(shè)備(模擬器)能否用于沙盒儲(chǔ)值測(cè)試 | 不能 | 不能 | 不能 | 不能 |
能否用于送審 TestFlight | 不能 | 不能 | 能 | 不能 |
不越獄能否打開應(yīng)用的“Documents、Library吻贿、tmp”目錄 | 能 | 不能 | 不能 | 不能 |
越獄設(shè)備能否打開應(yīng)用的“Documents尝江、Library、tmp”目錄 | 能 | 能 | 能 | 能 |
添加設(shè)備UDID到證書:
iPhone手機(jī)輕松獲取UDID的六種方式 - 簡(jiǎn)書
2喊括、重簽名流程
1.添加p12證書
# Import items into a keychain.
$ security import inputfile [-k keychain] [-t type] [-f format] [-w] [-P passphrase] [options...]
$ security import /Users/htc/Desktop/distest.p12 -P '123456'
2.解壓ipa包
$ unzip yourApp.ipa
查找 .app目錄,刪除系統(tǒng)臨時(shí)文件
$ rm -rf ./Payload/yourAppName.app/.DS_Store
3.修改內(nèi)容
修改Payload/yourName.app中的icon圖標(biāo)矢棚、Info.plist文件的信息等郑什,如有需要也可以更改比如版本號(hào),應(yīng)用名稱等蒲肋。
4.刪除之前的簽名 _CodeSignature
$ rm -rf ./Payload/yourAppName.app/_CodeSignature
5.用包里的描述文件生成entitlements.plist
文件
查看描述文件內(nèi)容的命令:
$ security cms -D -i "xxx.mobileprovision"
上面命令會(huì)輸出內(nèi)容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>AppIDName</key>
<string>iLeetCode</string>
<key>ApplicationIdentifierPrefix</key>
<array>
<string>28PV6G96R7</string>
</array>
<key>CreationDate</key>
<date>2019-10-01T12:57:15Z</date>
<key>Platform</key>
<array>
<string>iOS</string>
</array>
<key>IsXcodeManaged</key>
<true/>
<key>DeveloperCertificates</key>
<array>
<data></data>
</array>
<key>Entitlements</key>
<dict>
<key>application-identifier</key>
<string>28PV6G96R7.com.iHTCboy.iLeetCoder</string>
<key>keychain-access-groups</key>
<array>
<string>28PV6G96R7.*</string>
</array>
<key>get-task-allow</key>
<true/>
<key>com.apple.developer.team-identifier</key>
<string>28PV6G96R7</string>
<key>aps-environment</key>
<string>development</string>
</dict>
<key>ExpirationDate</key>
<date>2020-09-30T12:57:15Z</date>
<key>Name</key>
<string>iOS Team Provisioning Profile: com.iHTCboy.iLeetCoder</string>
<key>ProvisionedDevices</key>
<array>
<string>c286167280be0083fd23e59aaa805e1f3fbdwsd0</string>
</array>
<key>TeamIdentifier</key>
<array>
<string>28PV6G96R7</string>
</array>
<key>TeamName</key>
<string>he tiancong</string>
<key>TimeToLive</key>
<integer>365</integer>
<key>UUID</key>
<string>9f1fb7b7-2549-4fc6-8893-344f4ddb3580</string>
<key>Version</key>
<integer>1</integer>
</dict>
</plist>%
可以用管道命令 >
保存成 plist 文件:
$ security cms -D -i embedded.mobileprovision > entitlement_full.plist
如果只保留 Entitlements
屬性內(nèi)容蘑拯,則可以使用PlistBuddy
命令,我們重簽只需要 Entitlements 屬性:
$ /usr/libexec/PlistBuddy -x -c \'Print:Entitlements\' entitlement_full.plist > entitlement.plist
注:本步驟的 Entitlements 屬性內(nèi)容非常重要兜粘,不能多字段申窘,或者字段設(shè)置true或false錯(cuò)誤,都會(huì)導(dǎo)致異常情況孔轴,否則重簽是有效偶洋,但導(dǎo)致ipa包安裝失敗~
6.替換描述文件
把新的描述文件復(fù)制替換到解壓后的目錄中,這個(gè)需要看自己需要距糖,舊包的描述權(quán)限與新證書的權(quán)限玄窝,是需要那些,上一步驟中 Entitlements
就是在重簽時(shí)還可以在指定悍引。
$ cp ./embedded.mobileprovision ./Payload/yourAppName.app/embedded.mobileprovision
如果需要查看系統(tǒng)中已經(jīng)保存的描述文件:~/Library/MobileDevice/Provisioning\ Profiles/
7.給 MachO 文件添加執(zhí)行權(quán)限
解壓ipa文件時(shí)恩脂,app里面的 MachO 文件可能沒有執(zhí)行權(quán)限,導(dǎo)致重簽的包安裝時(shí)提示失敗趣斤。
chmod +x ./Payload/yourAppName.app/yourAppName
注俩块,如果Python腳本有對(duì)應(yīng)的庫(kù)可以查看 MachO,如果是 Shell 腳本浓领,可以利用 Info.plist 文件中已經(jīng)有 MachO 對(duì)應(yīng)的文件名玉凯,可以通過下面命令讀取:
MachO_BINARY=`plutil -convert xml1 -o - $TARGET_APP_PATH/Info.plist|grep -A1 Exec|tail -n1|cut -f2 -d\>|cut -f1 -d\<`
當(dāng)然联贩,一般路徑下app的名字與 MachO 一樣 Payload/yourAppName.app/yourAppName
漫仆。具體方式大家自行選擇~
8.獲取證書內(nèi)容
這一步需要讀取鑰匙串中的開發(fā)者證書,可以用以下命令查看下有哪些證書:
$ security find-identity -p codesigning -v
上面命令輸出:
1) A80A1543C48DBCB85F4F185B2D38E7A25E5A48E5 "iPhone Developer: ihtcboy@htc.com (8RRC787ZH2)"
2) D7A8D149DCCFB882BEDFA68913B50623D38C8C49 "iPhone Distribution: Guangzhou HTC Internet Technology Co.,LTD"
3) 900EC6AC6961B824BBAED3303E036A2F5421935A "iPhone Developer: iHTCboy (2HT78BY87T)"
...
...
注意泪幌,下面的重簽命令盲厌,需要使用上面的 "iPhone Developer: ihtcboy@htc.com (8RRC787ZH2)" 參數(shù)
9.重新簽名
先重簽名framework和dylib(不重簽的話署照,就刪除無法簽名的插件文件: Framework
、PlugIns
文件夾吗浩、Watch
文件夾)
# sign
codesign -s identity [-fv*] [-o flags] [-r reqs] [-i ident] path ...
# verify
codesign -v [-v*] [-R=<req string>|-R <req file path>] path|[+]pid ...
# display contents
codesign -d [options] path ...
# display hosting paths
codesign -h pid ...
$ /usr/bin/codesign --force --sign "iPhone Distribution:xxxxx" /Payload/XX.app/Frameworks/xxx.framework
再簽名.app:
$ /usr/bin/codesign -f -s "iPhone Distribution:xxxxx" --entitlements entitlements.plist ./Desktop/Payload/yourAppName.app
注意:簽名app需要添加參數(shù) --entitlements entitlements.plist
重簽成功后提示:
./Payload/yourAppName.app: replacing existing signature.
10.壓縮Payload 生成最終 .ipa 文件
用 zip
文件壓縮生成最終的重簽后的ipa文件
$ zip -ry ABC.ipa Payload
11.驗(yàn)證簽名有效性(可選)
macOS 10.11 后建芙,codesign
命令增加了驗(yàn)證簽名正確性,當(dāng)然驗(yàn)證簽名信息在真機(jī)上進(jìn)行安裝可安裝就說明可以用懂扼。
驗(yàn)證簽名正確性:
$ codesign -v Payload/XX.app
查看app的簽名信息:
$ codesign -vv -d Payload/XX.app
12.刪除安裝的p12證書(可選)
如果是公共設(shè)備環(huán)境禁荸,可能執(zhí)行刪除命令,刪除步驟1中導(dǎo)入的證書阀湿。
$ security delete-certificate -c "iPhone Distribution: Guangzhou HTC Internet Technology Co.,LTD"
13.其它可能使用到的命令(可選)
檢查一下是否安裝了AppleWWDRCA.cer:
security find-certificate -c "Apple Worldwide Developer Relations Certification Authority"
查看 app 的 entitlements:
codesign --entitlements :- -d Payload/yourAppName.app
3赶熟、總結(jié)
關(guān)于 iOS 重簽名流程就這樣簡(jiǎn)單和清晰的列出來了,但是有非常多的知識(shí)點(diǎn)可以深入炕倘,需要大家自行實(shí)踐,還有很多坑點(diǎn)翰撑,這里只是簡(jiǎn)單提一下罩旋,深入的命令使用和證書知識(shí)、證書安全眶诈、命令的注意事項(xiàng)等涨醋,需要大家實(shí)踐見真知!
參考
- HanProjectCoder/ResignForiOS: ipa resign
- fastlane/sigh at master · fastlane/fastlane
- cjsliuj/Scalpel: A MacOS app with resign, dylib link injection/delete, ipa metadata edit.
- Scalpel的實(shí)現(xiàn):一款集動(dòng)態(tài)庫(kù)注入與刪除逝撬、IPA重簽名浴骂、IPA元數(shù)據(jù)修改為一體的MacOS App
- cfgutil man page
- shell - install .p12 or .cer in console macos - Stack Overflow
- reSignature/TFSignature.py at master · hongbaoshi/reSignature
- iOS開發(fā)中的應(yīng)用打包方式及重簽名的一些總結(jié) - 簡(jiǎn)書
- iOS代碼簽名與重簽名 · 0x5e的博客
- DanTheMan827/ios-app-signer: This is an app for OS X that can (re)sign apps and bundle them into ipa files that are ready to be installed on an iOS device.
- iOS App Signer - Instructions
- iPhone手機(jī)輕松獲取UDID的六種方式 - 簡(jiǎn)書
- About Code Signing
- ios - Re-signing an IPA that contains a Framework - Stack Overflow
- “User interaction is not allowed” trying to sign an OSX app using codesign
- 如有疑問,歡迎在評(píng)論區(qū)一起討論宪潮!
- 如有不正確的地方溯警,歡迎指導(dǎo)!
注:本文首發(fā)于 iHTCboy's blog狡相,如若轉(zhuǎn)載梯轻,請(qǐng)注來源