簽名相關的命令:
?$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文件
在終端使用命令otool -l DingTalk | grep crypt,0是已脫殼,大于0是未脫殼(一
般為1)
終端查看本地有效證書
$security find-identity -v -p codesigning
刪除無法簽名的插件文件
刪除Plugins文件夾和Watch文件夾
對.app文件夾內的Frameworks文件夾中的每一個framework強制重簽名
命令:$ codesign -fs "iPhone Developer: xxx " xxx.framework
找到framework文件夾下所有.framework,分別使用上面的命令對其簽名。
注意不要遺漏,每一個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
對xx.app開始簽名
使用的命令: zip –ry 輸出文件 輸入文件 命令。也可以手動壓縮。
方法二 自動化腳本文件。
將上述操作 通過shell命令 寫個腳本文件。然后一鍵操作。
shell腳本語言命令
方法三: 用第三方工具。快速搞定
地址: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腳本
使用之前先安裝一下腳本環境
- 安裝神器brew,沒有安裝的看這里:Homebrew
- 安裝ruby,命令:
brew install ruby
- 安裝sigh,命令:
sudo gem install sigh
,過程比較漫長。
應用場景:
主要解決因重復打包導致測試同學回歸測試的包和上傳App Store的包不一致的問題。以及 合作方之間 證書不一致,需要重新簽名問題。
App開發測試流程
分析:一般情況下,流程如下:
- 開發同學完成開發后,打包給測試同學測試
- 測試同學發現bug,然后開發同學繼續開發改bug、打包
- 測試到一定階段后,開發同學打包(封板),測試同學做回歸測試
- 回歸測試完成之后,開發同學再次打包上傳App Store
可能存在的問題:
- 多次打包,麻煩,編譯一次的成本比想象中大
- 多次打包,可能會導致測試同學回歸測試的包和上傳App Store的包不一致(!important)
解決辦法:
對回歸測試通過的ipa包進行重新簽名,然后上傳 App Store
ipa包重新簽名
新版本的ipa包重新簽名
-
切換至ipa目錄
imagexxx.ipa和xxxDistrbution.mobileprovision文件在同一目錄下
-
在終端輸入
fastlane sigh resign
命令
image此時會看到可選擇的 identities 列表
-
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
替換前(開發證書打的包)
替換后(企業證書打的包)
準備工作
- 已經經過破殼處理的iTunes ipa包或者第三方越獄應用等;
- 開發者測試證書和描述文件;
- 簽名工具:sigh命令行或者ResignTool客戶端。
本文主要講述sigh命令的安裝和使用。
安裝
首先確保你安裝了Xcode的命令行工具。
xcode-select --install
然后通過gem安裝sigh,gem的安裝請自行谷歌。
sudo gem install sigh
如何使用
在終端執行
sigh resign
依次執行下列步驟:
- 顯示
Path to ipa file:
-將重簽ipa拖入回車; - 顯示
Signing Identity:
-填寫正確的簽名證書回車; - 顯示
Path to provisioning file:
-將簽名所用的描述文件拖入回車; - 最后等簽名結果,成功后會替換原路徑的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