iOS包重簽名技術(shù)知識(shí)

1眼刃、簡(jiǎn)介

利用Xcode的命令 securitycodesign 重簽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(不重簽的話署照,就刪除無法簽名的插件文件: FrameworkPlugIns 文件夾吗浩、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í)踐見真知!

參考


  • 如有疑問,歡迎在評(píng)論區(qū)一起討論宪潮!
  • 如有不正確的地方溯警,歡迎指導(dǎo)!


注:本文首發(fā)于 iHTCboy's blog狡相,如若轉(zhuǎn)載梯轻,請(qǐng)注來源

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市尽棕,隨后出現(xiàn)的幾起案子喳挑,更是在濱河造成了極大的恐慌,老刑警劉巖滔悉,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伊诵,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡回官,警方通過查閱死者的電腦和手機(jī)曹宴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來歉提,“玉大人浙炼,你說我怎么就攤上這事份氧。” “怎么了弯屈?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵蜗帜,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我资厉,道長(zhǎng)厅缺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任宴偿,我火速辦了婚禮湘捎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘窄刘。我一直安慰自己窥妇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布娩践。 她就那樣靜靜地躺著活翩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪翻伺。 梳的紋絲不亂的頭發(fā)上材泄,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音吨岭,去河邊找鬼拉宗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛辣辫,可吹牛的內(nèi)容都是我干的旦事。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼急灭,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼族檬!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起化戳,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤单料,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后点楼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扫尖,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年掠廓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了换怖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蟀瞧,死狀恐怖沉颂,靈堂內(nèi)的尸體忽然破棺而出条摸,到底是詐尸還是另有隱情,我是刑警寧澤铸屉,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布钉蒲,位于F島的核電站,受9級(jí)特大地震影響彻坛,放射性物質(zhì)發(fā)生泄漏顷啼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一昌屉、第九天 我趴在偏房一處隱蔽的房頂上張望钙蒙。 院中可真熱鬧,春花似錦间驮、人聲如沸躬厌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扛施。三九已至,卻和暖如春抢呆,著一層夾襖步出監(jiān)牢的瞬間煮嫌,已是汗流浹背笛谦。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工抱虐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人饥脑。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓恳邀,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親灶轰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谣沸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容