一、ipa簽名相關指令
1、快捷檢視系統中能用來對代碼進行簽名的證書
//可以使用如下指令:
$security find-identity -v -p codesigning
) B3991DEFAEEC7CD640A4093FAD72FF642D6F4FCA "iPhone Distribution: Beijing Certificate Authority Co., Ltd." (CSSMERR_TP_CERT_REVOKED)
//這就說明目前有一個同時有公鑰和私鑰的可用證書。
2、對未簽名app手動簽名
$ codesign -s 'iPhone Distribution: Beijing Certificate Authority Co., Ltd.' Example.app
3、對已簽名app重新簽名
//為了重新設定簽名,你必須帶上 -f 參數,有了這個參數,codesign 會用你選擇的簽名替換掉已經存在的那一個:
$ codesign -f -s 'iPhone Distribution: Beijing Certificate Authority Co., Ltd.' Example.app
4、檢視指定app的簽名資訊
//codesign 還可以為你提供有關一個可執行檔案簽名狀态的資訊,這些資訊在出現不明錯誤時會提供巨大的幫助:
$ codesign -vv -d Example.app
5、驗證簽名檔案的完整性
//檢查已簽名的檔案是否完整可以使用如下指令:
$ codesign --verify Example.app
//就像大多數 UNIX 工具一樣,沒有任何輸出代表簽名是完好的。如果修改一下這個二進制檔案:
$ echo 'lol' >> Example.app/Example
$ codesign --verify Example.app
Example.app: main executable failed strict validation
//和預料中的一樣,修改已經簽名的應用會導緻數字簽名驗證不通過。
二、ipa簽名相關檔案
1、資源檔案簽名
* * * 簽名值的村存放位置?* * *
經過觀察CodeResources檔案存放的貌似不是簽名值,而是程式包内的各個檔案的hash值的base64,具體簽名值的存放位置還不是很清楚。
iOS 和 OS X 的應用和架構則是包含了它們所需要的資源在其中的。這些資源包括圖檔和不同的語言檔案,資源中也包括很重要的應用組成部分例如 XIB/NIB 檔案,存檔檔案(archives),甚至是證書檔案。是以為一個程式包設定簽名時,這個包中的所有資源檔案也都會被設定簽名。
為了達到為所有檔案設定簽名的目的,簽名的過程中會在程式包(即Example.app)中建立一個叫做 _CodeSignatue/CodeResources 的檔案,這個檔案中存儲了被簽名的程式包中所有檔案的簽名。你可以自己去檢視這個簽名清單檔案,它僅僅是一個 plist 格式檔案。
這個清單檔案中不光包含了檔案和它們的簽名的清單,還包含了一系列規則,這些規則決定了哪些資源檔案應當被設定簽名。伴随 OS X DP 和 版本的釋出,蘋果改變了代碼簽名的格式,也改變了有關資源的規則。如果你使用或者更高版本的 codesign 工具,在 CodeResources 檔案中會有個不同區域,其中的 rules 和 files 是為老版本準備的,而 files2 和 rules2 是為新的第二版的代碼簽名準備的。最主要的差別是在新版本中你無法再将某些資源檔案排除在代碼簽名之外,在過去你是可以的,隻要在被設定簽名的程式包中添加一個名為 ResourceRules.plist 的檔案,這個檔案會規定哪些資源檔案在檢查代碼簽名是否完好時應該被忽略。但是在新版本的代碼簽名中,這種做法不再有效。所有的代碼檔案和資源檔案都必須 設定簽名,不再可以有例外。在新版本的代碼簽名規定中,一個程式包中的可執行程式包,例如擴充 (extension),是一個獨立的需要設定簽名的個體,在檢查簽名是否完整時應當被單獨對待。
2、授權檔案(entitlements)
在 iOS 上你的應用能做什麼依然是沙盒限制的,這些限制大多情況下都由授權檔案(entitlements)來決定。授權機制決定了哪些系統資源在什麼情況下允許被一個應用使用,簡單的說它就是一個沙盒的配置清單。
運作如下指令:
$ codesign -d --entitlements - Example.app
會得到類似的結果:
<!--?xml version="1.0" encoding="UTF-8"?-->
<plist version="1.0">
<dict>
<key>application-identifier</key>
<string>7TPNXN7G6K.ch.kollba.example</string>
<key>aps-environment</key>
<string>development</string>
<key>com.apple.developer.team-identifier</key>
<string>7TPNXN7G6K</string>
<key>com.apple.developer.ubiquity-container-identifiers</key>
<array>
<string>7TPNXN7G6K.ch.kollba.example</string>
</array>
<key>com.apple.developer.ubiquity-kvstore-identifier</key>
<string>7TPNXN7G6K.ch.kollba.example</string>
<key>com.apple.security.application-groups</key>
<array>
<string>group.ch.kollba.example</string>
</array>
<key>get-task-allow</key>
<true>
</true></dict>
</plist version="1.0">
在 Xcode 的 Capabilities 頁籤下選擇一些選項之後,Xcode 就會生成這樣一段 XML。 Xcode 會自動生成一個 .entitlements 檔案,然後在需要的時候往裡面添加條目。當建構整個應用時,這個檔案也會送出給 codesign 作為應用所需要擁有哪些授權的參考。這些授權資訊必須都在開發者中心的 App ID 中啟用,并且包含在後文介紹的描述檔案中。在建構應用時需要使用的授權檔案可以在 Xcode build setting 中的 code signing entitlements中設定。
在新版本的 Xcode 6 之後,授權資訊清單會以 Example.app.xcent 這樣的名字的檔案形式包含在應用包中。這麼做或許是為了在出現配置錯誤時提供更加有用的錯誤資訊。
3、描述檔案
在整個代碼簽名和沙盒機制中有一個組成部分将簽名,授權和沙盒聯系了起來,那就是描述檔案 (provisioning profiles)。
OS X中儲存目錄
Xcode 将從開發者中心下載下傳的全部配置檔案都放在了這裡:
~/Library/MobileDevice/Provisioning Profiles
檔案格式
描述檔案并不是一個普通的plist檔案,它是一個根據密碼訊息文法 (Cryptographic Message Syntax) 加密的檔案。
以XML格式檢視該檔案的指令:
$ security cms -D -i example.mobileprovision
檔案内容
描述檔案主要包含以下内容:
· UUID
每一個配置檔案都有它自己的 UUID 。Xcode 會用這個 UUID 來作為辨別,記錄你在 build settings 中選擇了哪一個配置檔案。
· ProvisionedDevices
記錄所有可用于調試的裝置ID。
· DeveloperCertificates
包含了可以為使用這個配置檔案的應用簽名的所有證書。所有的證書都是基于 Base64 編碼符合 PEM (Privacy Enhanced Mail, RFC ) 格式的。
· Entitlements
有關前面講到的配置檔案的所有内容都會被儲存在這裡。
參考:
1、https://objccn.io/issue-17-2/ 《代碼簽名探析》
2、https://www.objc.io/issues/17-security/inside-code-signing/ 《Inside Code Signing》