iOS 包簽名及重簽名

簽名相關的命令:
?$security find-identity -v -p codesigning -- 列出鑰匙串里可簽名的證書

  **$ security find-identity -v -p codesigning 
  1) 19F788D97B9D207BC51880CD16D27E3155EAD07A "iPhone Developer: ** (7T2P6H6P38)" (CSSMERR_TP_CERT_REVOKED)
  2) 30C568C3A80F3B0AA377E0F5C62D809B32570A0E "iPhone Distribution: China ** Bank Co., Ltd (GE82RV5YC2)"
  3) CBBA636E393834755573D184BE2557EA3FF218D4 "iPhone Distribution: Guangzhou ** Tech Co., Ltd."
  4) 8D5A4F69733DBF227DEBF8965FDA97B469D9C9A1 "iPhone Developer: ** (7T2P6H6P38)"
  5) E9399B8E9B995957857CA90003DF21E4C97BF354 "Mac Developer: **@163.com (F98N8WBRR3)"
     5 valid identities found

?$security cms -D -i embedded.mobileprovision -- 查看描述文件

<?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>combase</string>
    <key>ApplicationIdentifierPrefix</key>
    <array>
    <string>ZCGJEL3KM8</string>
    </array>
    <key>CreationDate</key>  // 描述文件創建的信息
    <date>2019-05-16T02:31:49Z</date>
    <key>Platform</key>
    <array>
        <string>iOS</string>
    </array>
    <key>IsXcodeManaged</key>
    <false/>
    <key>DeveloperCertificates</key>
    <array>
        <data>MIIFsjCCBJqgAwIBAgIIAy6HjoOMbQcwDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNVBAYTAlVTMRMwEQYDVQQKDApBcHBsZSBJbmMuMSwwKgYDVQQLDCNBcHBsZSBXb3JsZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9uczFEMEIGA1UEAww7QXBwbGUgV29ybGR3aWRlIERldmVsb3BlciBSZWxhdGlvbnMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTkwNTE1MDMxNjU0WhcNMjIwNTE0MDMxNjU0WjCBszEaMBgGCgmSJomT8ixkAQEMClpDR0pFTDNLTTgxQzBBBgNVBAMMOmlQaG9uZSBEaXN0cmlidXRpb246IEd1YW5nemhvdSBFdG9wIERpZ2l0YWwgVGVjaCBDby4sIEx0ZC4xEzARBgNVBAsMClpDR0pFTDNLTTgxLjAsBgNVBAoMJUd1YW5nemhvdSBFdG9wIERpZ2l0YWwgVGVjaCBDby4sIEx0ZC4xCzAJBgNVBAYTAkNOMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0b8v7AY7dVz6j3vjcAks30v5nE0JUmehRv28RpPWu30bNEHGWXU4yGlf4EfJVZ2HuMQSUGScSmqlp9bbUTfr4Sx9f+Qw6rCSz0W7Z6+BOYARaNZR96LWJ/A8WbF+974IDrkqGUmVZsBUYsCgilyi5uQDy05hqiEpkXKLoR8SsjCuw3hVeE8Lnx1nRweYmzijprkwSTWnCBnngPLrAOy3ayktYVjxoCHlMOd5sl8loQFpfIckiUe8V/LJvmCO97JV5igS+TsyywDFgXADcwnfeajuZKfAfXd9pCg+A+08uIY7I2/btwQM4r9ejssIne/r7XUAwI0jDJlNAcFPZdzsqwIDAQABo4IB4zCCAd8wDAYDVR0TAQH/BAIwADAfBgNVHSMEGDAWgBSIJxcJqbYYYIvs67r2R1nFUlSjtzA/BggrBgEFBQcBAQQzMDEwLwYIKwYBBQUHMAGGI2h0dHA6Ly9vY3NwLmFwcGxlLmNvbS9vY3NwMDItd3dkcjAxMIIBDwYDVR0gBIIBBjCCAQIwgf8GCSqGSIb3Y2QFATCB8TCBwwYIKwYBBQUHAgIwgbYMgbNSZWxpYW5jZSBvbiB0aGlzIGNlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRlIHBvbGljeSBhbmQgY2VydGlmaWNhdGlvbiBwcmFjdGljZSBzdGF0ZW1lbnRzLjApBggrBgEFBQcCARYdaHR0cDovL3d3dy5hcHBsZS5jb20vYXBwbGVjYS8wFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwMwHQYDVR0OBBYEFGmKEMbe+XvrlksrnVA5Kz5CpT67MA4GA1UdDwEB/wQEAwIHgDATBgoqhkiG92NkBgEEAQH/BAIFADANBgkqhkiG9w0BAQUFAAOCAQEAjinFdmlQ8BpedJhYEksVXsFoToRdSUvfeS+UKz2OO6T0iFe6MI4rtvgrGy4HdeClcY028yKepyQ+mT0gdfqsV4kcx55UVhqfRo4krlsv8UWjHZj5FUj6rfsEmVU6m//dI7iqhVul95xvgjJICUWzHd32qww4tRECdyBUK+YyKJ6pJxlr5WIx1OpqqVv0EPPF+K9nI2z9OVy+f0CjdPooYh0isB6GAE5P/V8yMcDdzXgn3ctMI+HegMT23AJ6ORNTLOT5QEVM5/xnbB32VtPmnjP4FmRy8SWrAv3XNrU6Z8+/QTJBcGnvJmXdQj+sBKRWV7Xrsga9GfSELK+GfzVXbw==</data>
    </array>

                                                                
    <key>Entitlements</key>
    <dict>
         <key>application-identifier</key>  // 描述文件匹配的bundleid , 帶星號代表 通配匹配。 
         <string>ZCGJEL3KM8.com.base.*</string>
         <key>keychain-access-groups</key>
         <array>
                <string>ZCGJEL3KM8.*</string>
        </array>
                        <key>get-task-allow</key>
        <false/>
                        <key>com.apple.developer.team-identifier</key>
        <string>ZCGJEL3KM8</string>

    </dict>
    <key>ExpirationDate</key>  // 描述文件的過期日期,過期后,通過該描述文件簽名的包便不可用(上架的除外),需要重新簽名
    <date>2020-05-15T02:31:49Z</date>
    <key>Name</key>  // 描述文件的名字
    <string>combaseinhouse</string>
    <key>ProvisionsAllDevices</key> // 是否為 Inhouse.  如果有該字段,并且為true 則表示無需綁定設備。 
    <true/>
    <key>TeamIdentifier</key> // 證書標識
    <array>
        <string>ZCGJEL3KM8</string>
    </array>
    <key>TeamName</key> // 證書開發團體
    <string>***  Tech Co., Ltd.</string>
    <key>TimeToLive</key>
    <integer>365</integer>
    <key>UUID</key>
    <string>b83d32b9-21b4-47e5-a9b7-e6039aca868a</string>
    <key>Version</key>
    <integer>1</integer>
</dict>

?$codesign–fs “證書串” 文件名 -- 強制替換簽名

/usr/bin/codesign --force --sign "iPhone Distribution: Guangzhou Etop Digital Tech Co., Ltd."  framworkpath -- 對framework文件下的第三方庫進行重簽名

方法一: 手動重簽名

重簽步驟:
1.刪除插件和帶有插件的.app包(比如Watch)
2.對Frameworks里面的庫進行重簽名
3.給可執行文件 +x(可執行)權限
4.替換描述文件
5.替換BundleID
6.通過授權文件(Entilements)重簽.app包

實際操作:
獲取破殼的ipa包
獲取第三方ipa包
查看ipa包是否已經破殼 》 非上架的都沒加殼,無需關注
解壓ipa包,進入playload文件夾,找到MachO文件

image.png

在終端使用命令otool -l DingTalk | grep crypt,0是已脫殼,大于0是未脫殼(一
般為1)

image.png

image.png

終端查看本地有效證書
$security find-identity -v -p codesigning

image.png

刪除無法簽名的插件文件
刪除Plugins文件夾和Watch文件夾

對.app文件夾內的Frameworks文件夾中的每一個framework強制重簽名
命令:$ codesign -fs "iPhone Developer: xxx " xxx.framework
找到framework文件夾下所有.framework,分別使用上面的命令對其簽名。

image.png

注意不要遺漏,每一個framework都要用自己的證書重簽一下

建議通過腳本命令執行:

    #! /bin/bash

echo "傳入framework文件夾路徑"
read TARGET_APP_FRAMEWORKS_PATH 
#到判斷是否能進入到frameworks 如果能進入則 開始循環簽名
if [ -d  "$TARGET_APP_FRAMEWORKS_PATH" ];
 then
    echo "進入到Framework:${TARGET_APP_FRAMEWORKS_PATH} 路徑中"

    for FRAMEWORK in "$TARGET_APP_FRAMEWORKS_PATH/"*; 
    do
        #簽名
        /usr/bin/codesign --force --sign "iPhone Distribution: Guangzhou Etop Digital Tech Co., Ltd." "$FRAMEWORK"

        #statements
    done

fi
    #statements

將要簽名的描述文件該成 embedded.mobileprovision 替換 來的 embedded.mobileprovision

創建entitlements.plist文件
查看描述文件內容,使用命令security cms -D -I embedded.mobileprovision,找到Entitlements節點,接著創建entitlements.plist文件,內容拷貝過去,最后把entitlements.plist文件拷貝到playload文件夾內(與xx.app同級)。
!](https://upload-images.jianshu.io/upload_images/1502585-e1694c8e1e77a197.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

修改xx.app包里面的info.plist中的bundleId為上面項目的bundleId

image.png

對xx.app開始簽名
使用的命令: /usr/bin/codesign -fs "iPhone Developer: xx" --no-strict --entitlements=entitlements.plist xx.app 在Payload下執行該命令 ![image.png](https://upload-images.jianshu.io/upload_images/1502585-f5f56b666841f368.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) **最后 對Payload壓縮下改成ipa包 就可以使用了** 可以使用zip –ry 輸出文件 輸入文件 命令。也可以手動壓縮。

方法二 自動化腳本文件。

將上述操作 通過shell命令 寫個腳本文件。然后一鍵操作。
shell腳本語言命令

image.png

方法三: 用第三方工具。快速搞定

地址:https://github.com/InjoyDeng/ResignTool

方法四:快速簡單簽名

蒲公英平臺重簽名

支持點補充

本文章主要介紹iOS 版本發布的兩個相關功能。

一 : iOS 開發出的版本發布安裝 用兩種方式 :

   1   --- 證書打包安裝(比較多,便不再介紹)
   2   --- 無證書打包安裝 (主要用于合作開發商之間,自定義版本簽名)
      具體步驟: 
      1. 首先把項目從模擬器改成通用設備(Generic iOS  Device), 然后command + B編    譯項目.2.  然后在Products文件夾下, 找到我們的app, 右鍵show in finder.3.  把這個app包復制到桌面, 然后創建一個名字為Payload的文件夾, 這里的文件夾名字不可以是其他的名字, 必須是Payload, 否則會失敗. 4, 然后把app包放進Payload文件夾內, 在把Payload文件夾壓縮后更改zip格式為ipa即可.

二:iOS逆向 ipa包重簽名
相關自動化簽名的鏈接: https://zhuanlan.zhihu.com/p/23180455
轉載: https://blog.csdn.net/chenyblog/article/details/78959762

軟件環境
Mac: v10.12.6 (16G29)
ruby: v2.3.4
rvm: v1.29.3
sigh: v2.71.1
Xcode: v9.2

使用sigh腳本
使用之前先安裝一下腳本環境

  1. 安裝神器brew,沒有安裝的看這里:Homebrew
  2. 安裝ruby,命令:brew install ruby
  3. 安裝sigh,命令:sudo gem install sigh,過程比較漫長。

應用場景:
主要解決因重復打包導致測試同學回歸測試的包和上傳App Store的包不一致的問題。以及 合作方之間 證書不一致,需要重新簽名問題。

App開發測試流程

image

分析:一般情況下,流程如下:

  1. 開發同學完成開發后,打包給測試同學測試
  2. 測試同學發現bug,然后開發同學繼續開發改bug、打包
  3. 測試到一定階段后,開發同學打包(封板),測試同學做回歸測試
  4. 回歸測試完成之后,開發同學再次打包上傳App Store

可能存在的問題:

  • 多次打包,麻煩,編譯一次的成本比想象中大
  • 多次打包,可能會導致測試同學回歸測試的包和上傳App Store的包不一致(!important

解決辦法:

對回歸測試通過的ipa包進行重新簽名,然后上傳 App Store

ipa包重新簽名

新版本的ipa包重新簽名

  1. 切換至ipa目錄


    image

    xxx.ipa和xxxDistrbution.mobileprovision文件在同一目錄下

  2. 在終端輸入fastlane sigh resign命令

    image

    此時會看到可選擇的 identities 列表

  3. Signing Identity:輸入用來簽名的證書標識


    image

    因為xxx.ipa和xxxDistrbution.mobileprovision文件在同一個目錄下,所以省略了拖拽ipa文件和證書配置文件等步驟。

如果xxx.ipa和xxxDistrbution.mobileprovision文件不在一個目錄下,你可能需要這樣做:
  • 在終端輸入fastlane sigh resign命令

  • Path to ipa file:

    • 輸入ipa文件路徑(拖拽ipa文件到終端即可)
  • Signing Identity:輸入用來簽名的證書標識(同上)

  • Path to provisioning file:

    • 輸入.mobileprovision文件路徑(拖拽.mobileprovision文件到終端即可)
  • 自動resign,成功

TIPS

輸入的 Signing Identity 如果和 .mobileprovision文件 不一致,那么終端上仍會提示resign成功,但是,安裝時會報錯!

查看app信息(校驗簽名是否替換成功)

codesign -vv -d xxx.app

替換前(開發證書打的包)

image

替換后(企業證書打的包)

image

準備工作


  • 已經經過破殼處理的iTunes ipa包或者第三方越獄應用等;
  • 開發者測試證書和描述文件;
  • 簽名工具:sigh命令行或者ResignTool客戶端。

本文主要講述sigh命令的安裝和使用。

安裝


首先確保你安裝了Xcode的命令行工具。

xcode-select --install

然后通過gem安裝sigh,gem的安裝請自行谷歌。

sudo gem install sigh

如何使用


在終端執行

sigh resign

依次執行下列步驟:

  1. 顯示Path to ipa file:-將重簽ipa拖入回車;
  2. 顯示Signing Identity:-填寫正確的簽名證書回車;
  3. 顯示Path to provisioning file:-將簽名所用的描述文件拖入回車;
  4. 最后等簽名結果,成功后會替換原路徑的ipa文件。

關于更多sigh用法請訪問sigh使用

最后


簽名成功的應用就可以順利在我們的設備中安裝了并使用了,用這個方法可以進行非越獄平臺安裝在正版基礎移植的越獄應用。

!注意:如果是對iTunes正版應用進行簽名在安裝后運行時會閃退,需要先將應用進行破殼處理,因為蘋果對應用進行了保護。

工具:https://github.com/InjoyDeng/ResignTool
借鑒:http://www.lxweimin.com/p/d68924e1af25

http://www.lxweimin.com/p/d68924e1af25
https://www.cnblogs.com/guohai-stronger/p/11781249.html

iOS APP簽名機制詳解

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,835評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,676評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,730評論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,118評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,873評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,266評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,330評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,482評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,036評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,846評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,025評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,575評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,279評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,684評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,953評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,751評論 3 394
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,016評論 2 375

推薦閱讀更多精彩內容