你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> [Xcode]iOS代碼簽名(Code Signing)

[Xcode]iOS代碼簽名(Code Signing)

編輯:IOS開發綜合
在打包過程中讓我吃了不少苦頭,歸根到底是對一些概念和一些原理不清楚不明白,...

數字簽名(digital signature)

對指定信息使用哈希算法,得到一個固定長度的信息摘要,然後再使用私鑰 (注意必須是私鑰)對該摘要加密,就得到了數字簽名。所謂的代碼簽名就是這個意思。

數字證書(digital certificate)

證書生產

開發者在申請iOS開始證書時,需要通過keychain生產一個CSR文件(CertificateSigningRequest),提交給蘋果的證書認證中心進行簽名[Apple Worldwide Developer Relations Certification Authority(WWDR)],最後從蘋果官網下載並安裝使用。這個過程中還會產生一個私鑰,證書和私鑰在keychain中的位置如圖:

\

iOS證書申請和使用詳解

證書組成

經過WWDR數字簽名後的數字證書長這個樣子:
\
其中包含兩大部分:
證書本身包含用戶的公鑰、用戶個人信息、證書頒發機構信息、證書有效期等信息。
證書簽名

WWDR將上述證書本身內容的使用哈希算法得到一個固定長度的信息摘要,然後使用自己的私鑰對該信息摘要加密生成數字簽名,整個過程如圖所示:

\


證書使用

iOS系統原本就持有WWDR的公鑰,系統首先會對證書內容通過指定的哈希算法計算得到一個信息摘要;然後使用WWDR的公鑰對證書中包含的數字簽名解密,從而得到經過WWDR的私鑰加密過的信息摘要;最後對比兩個信息摘要,如果內容相同就說明該證書可信。整個過程如圖所示:\

在驗證了證書是可信的以後,iOS系統就可以獲取到證書中包含的開發者的公鑰,並使用該公鑰來判斷代碼簽名的可用性了。

證書存在的意義

通過證書使用過程可以看出,證書本身只是一個中間媒介,iOS系統對證書並不關心,它其實只想要證書中包含的開發者的公鑰!!
但是開發者怎麼才能證明公鑰是自己的呢?iOS安全系統怎麼才能相信這個公鑰就是這個開發者的呢?
不管是哪一個開發者對iOS的安全系統說,這個公鑰就是我的,系統是都不相信的,即系統對開發者有著百分之百的不信任感。但是iOS安全系統對自家的WWDR是可信任的,蘋果將WWDR的公鑰內置在了iOS系統中。有了證書,iOS安全系統只需要通過WWDR的公鑰就可以獲取到任何一個開發者的可信任的公鑰了,這就是證書存在的意義!!

公鑰(public key)

公鑰被包含在數字證書裡,數字證書又被包含在描述文件(Provisioning File)中,描述文件在應用被安裝的時候會被拷貝到iOS設備中。
iOS安全系統通過證書就能夠確定開發者身份,就能夠通過從證書中獲取到的公鑰來驗證開發者用該公鑰對應的私鑰簽名後的代碼、資源文件等有沒有被更改破壞,最終確定應用能否合法的在iOS設備上合法運行。

私鑰(private key)

每個證書(其實是公鑰)都對應有一個私鑰,私鑰會被用來對代碼、資源文件等簽名。只有開發證書和描述文件是沒辦法正常調試的,因為沒有私鑰根本無法簽名。

簽名相關命令

快捷查看系統中能用來對代碼進行簽名的證書可以使用如下命令:security find-identity -v -p codesigning
\

這就說明當前有10個同時有公鑰和私鑰的可用證書。
對未簽名app手動簽名

使用如下命令:codesign -s 'iPhone Developer: Yongjun Ma (5R2CR73PQ7)' TXChatParent.app

: xx.app文件是xx.ipa文件修改擴展名,xx.ipa.zip解壓後包含的xx.app文件。

對已簽名app重新簽名為了重新設置簽名,你必須帶上 -f 參數,有了這個參數,codesign 會用你選擇的簽名替換掉已經存在的那一個:codesign -f -s 'iPhone Developer: Yongjun Ma (5R2CR73PQ7)' TXChatParent.app
查看指定app的簽名信息codesign 還可以為你提供有關一個可執行文件簽名狀態的信息,這些信息在出現不明錯誤時會提供巨大的幫助:codesign -vv -d /Users/apple/genPackage/IOS_Parent/Payload/TXChatParent.app

\

驗證簽名文件的完整性

檢查已簽名的文件是否完整可以使用如下命令:
codesign --verify /Users/apple/genPackage/IOS_Parent/Payload/TXChatParent.app
就像大多數 UNIX 工具一樣,沒有任何輸出代表簽名是完好的。如果修改一下這個二進制文件:
\
和預料中的一樣,修改已經簽名的應用會導致數字簽名驗證不通過。

資源文件簽名

iOS 和 OS X 的應用和框架則是包含了它們所需要的資源在其中的。這些資源包括圖片和不同的語言文件,資源中也包括很重要的應用組成部分例如 XIB/NIB 文件,存檔文件(archives),甚至是證書文件。所以為一個程序包設置簽名時,這個包中的所有資源文件也都會被設置簽名。
為了達到為所有文件設置簽名的目的,簽名的過程中會在程序包(即Example.app)中新建一個叫做 _CodeSignatue/CodeResources 的文件,這個文件中存儲了被簽名的程序包中所有文件的簽名。你可以自己去查看這個簽名列表文件,它僅僅是一個 plist 格式文件。

授權文件(entitlements)

在 iOS 上你的應用能做什麼依然是沙盒限制的,這些限制大多情況下都由授權文件(entitlements)來決定。授權機制決定了哪些系統資源在什麼情況下允許被一個應用使用,簡單的說它就是一個沙盒的配置列表。
運行如下命令:codesign -d --entitlements - /Users/apple/genPackage/IOS_Parent/Payload/TXChatParent.app
\

在 Xcode 的 Capabilities 選項卡下選擇一些選項之後,Xcode 就會生成這樣一段 XML。 Xcode 會自動生成一個 .entitlements 文件,然後在需要的時候往裡面添加條目。當構建整個應用時,這個文件也會提交給 codesign 作為應用所需要擁有哪些授權的參考。這些授權信息必須都在開發者中心的 App ID 中啟用,並且包含在後文介紹的描述文件中。在構建應用時需要使用的授權文件可以在 Xcode build setting 中的 code signing entitlements中設置。
在新版本的 Xcode 6 之後,授權信息列表會以 Example.app.xcent 這樣的名字的文件形式包含在應用包中。這麼做或許是為了在出現配置錯誤時提供更加有用的錯誤信息。

描述文件(provisioning file)

在整個代碼簽名和沙盒機制中有一個組成部分將簽名,授權和沙盒聯系了起來,那就是描述文件 (provisioning profiles)。
OS X中保存目錄Xcode 將從開發者中心下載的全部配置文件都放在了這裡:
~/Library/MobileDevice/Provisioning\ Profiles
文件格式描述文件並不是一個普通的plist文件,它是一個根據密碼訊息語法 (Cryptographic Message Syntax) 加密的文件。
以XML格式查看該文件的命令:security cms -D -i b95d2739-7ae4-4426-8bae-c83d2777a45b.mobileprovision




	AppIDName
	teacherClient
	ApplicationIdentifierPrefix
	
	LB3ZWQKTZB
	
	CreationDate
	2016-10-19T05:56:17Z
	Platform
	
		iOS
	
	DeveloperCertificates
	
		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
	
	Entitlements
	
		keychain-access-groups
		
			LB3ZWQKTZB.*		
		
		get-task-allow
		
		application-identifier
		LB3ZWQKTZB.com.shangde.ps.teacher
		com.apple.security.application-groups
		
		
		com.apple.developer.team-identifier
		LB3ZWQKTZB
		aps-environment
		production
		beta-reports-active
		
	
	ExpirationDate
	2017-10-17T10:37:32Z
	Name
	XC: com.shangde.ps.teacher
	TeamIdentifier
	
		LB3ZWQKTZB
	
	TeamName
	Beijing XieChengShangDe Education Technology Co.,Ltd.
	TimeToLive
	363
	UUID
	b95d2739-7ae4-4426-8bae-c83d2777a45b
	Version
	1
文件內容:描述文件主要包含以下內容:
UUID:每一個配置文件都有它自己的 UUID 。Xcode 會用這個 UUID 來作為標識,記錄你在 build settings 中選擇了哪一個配置文件。ProvisionedDevices:記錄所有可用於調試的設備ID。DeveloperCertificates:包含了可以為使用這個配置文件的應用簽名的所有證書。所有的證書都是基於 Base64 編碼符合 PEM (Privacy Enhanced Mail, RFC 1848) 格式的。Entitlements:有關前面講到的配置文件的所有內容都會被保存在這裡。
  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved