蘋果開發之App簽名


如果你的Apple ID賬號(可使用郵箱來注冊)為Apple developer類型的話,登錄之后是看不到Certificates, Indentifiers & Profiles信息的

Apple developer是最基礎的賬號類型,主要用來在App Store下載各種應用(包括xCode等開發工具和SDK庫)及在iCloud上備份文件和照片

可通過點擊下方的“Joining the Developer Program”鏈接,按照指引點擊enroll按鈕,付費99$/year之后,成為registered Apple developer

此時你才能看到Certificates, IDs & Profiles按鈕,點擊之后就可以進入Certificates, Indentifiers & Profiles面板了

 

Certificate(證書)

Certificates(證書)是一個經證書授權中心數字簽名的包含公開密鑰擁有者信息以及公開密鑰的文件

用於用來給應用程序簽名(Signature)的,只有經過簽名的應用程序才能保證它的來源是可信任的,並且代碼是完整的, 未經修改的

證書一般具有時效性,只在特定的時間段內有效。

 

蘋果的證書分為Development和Distribution兩種。Development證書用於開發和調試應用程序,可用於真機調試;Distribution證書用於打包上傳App Store,用於驗證開發者身份

Certificates列表中列出證書(.cer文件)都是公鑰證書,如果這個證書是在別人機器上生成的,在機器上安裝后是沒有私鑰與其匹配的

注1:在mac中,可以通過右鍵快捷菜單“快速查看XXX.cer”來查看證書的基本信息

注2:鑰匙串訪問(Keychain Access)在應用程序\實用工具(Applications\Utilities)中

你可以在自己的機器上創建一個與本機私鑰相匹配的公鑰證書(.cer文件)

方法1:

(1)選擇證書分類,在鑰匙串訪問(Keychain Access)菜單:“鑰匙串訪問” -- “證書助理” -- “從證書頒發機構請求證書”

         用戶電子郵件地址和CA電子郵件地址可以隨便輸入一個郵箱,常見名稱為密鑰的名稱,點擊繼續后會從蘋果官方CA(Certificate Authority,證書授權中心)獲取得到一個證書請求文件(.certSigningRequest文件)

注:生成certSigningRequest文件過程中,實際上是生成了一對公鑰和私鑰(Key Pair),保存在你Mac的keychain中。代碼簽名正是使用這種基於非對稱秘鑰的加密方式,用私鑰進行簽名,用公鑰進行驗證。

如下圖所示,在你Mac的keychain的login中存儲着相關的公鑰和私鑰,而證書中包含了公鑰。你只能用私鑰來進行簽名,所以如果沒有了私鑰,就意味着你不能進行簽名了,所以就無法使用這個證書了,此時你只能revoke(刪除)之前的證書再申請一個。

因此在申請完證書時,最好導出並保存好你的私鑰。當你想與其他人或其他設備共享證書時,把私鑰傳給它就可以了。私鑰保存在你的Mac中,而蘋果生成的Certificate中包含了公鑰。

當你用自己的私鑰對代碼簽名后,蘋果就可以用證書中的公鑰來進行驗證,確保是你對代碼進行了簽名,而不是別人冒充你,同時也確保代碼的完整性等

(2)在頁面上點擊“+”創建一個新證書,選擇證書類型后,需要上傳第一步中的certSigningRequest文件,來生成與本機私鑰相匹配的公鑰證書(.cer文件)

(3)下載.cer文件,雙擊或將其拖入鑰匙串訪問(Keychain Access)中進行安裝,結果如下

注:左邊有個三角形箭頭的證書是可以點開看到專用密鑰(private key),這種證書才能用來簽名應用程序

方法2:

在菜單Xcode -- “Preferences”的Accounts標簽頁中,登錄Apple ID賬號后,也可以看到賬號下的證書列表

點擊左下角的+號可以創建並安裝一個有私鑰的證書

注1:點擊左下角的+號來創建安裝一個證書時,才會刷新XCode這個證書列表(應該是一個bug)

注2:灰色(Stauts:Not in Keychain)為沒有安裝到鑰匙串訪問(Keychain Access)的證書

         圖標上帶個x(Status:Missing Private Key)為安裝到鑰匙串訪問(Keychain Access)但在本機找不到私鑰相匹配的公鑰證書

         正常圖標為安裝到鑰匙串訪問(Keychain Access)且本機有私鑰相匹配的證書

 

在mac上通過Security工具來查看當前機器上擁有有效的私鑰證書(即可用來給程序簽名的證書)   更多Security命令詳見:Mac Security工具使用總結

security find-identity -v -p codesigning

注:Security是Mac系統中鑰匙串和安全模塊的命令行管理工具,(圖形化工具為Keychain Access.app)。

鑰匙串(Keychain)實質上就是一個用於存放證書、密鑰、密碼等安全認證實體的倉庫,在計算機中保存為一個.keychain的文件

 

從鑰匙串訪問(Keychain Access)將含有私鑰的證書導出(.p12文件)給其他mac機器使用

(1)選中證書私鑰,右鍵菜單選擇“導出xxx...”,選擇保存路徑

(2)會彈出一個框,要求填入一個對p12文件加密密碼(也可以不填)

(3)最后,鑰匙串訪問(Keychain Access)會要求輸入當前賬號密碼來授權輸出p12證書文件

 

在mac上, 雙擊證書(.p12文件)或將證書拖入到鑰匙串訪問(Keychain Access)即可完成證書的安裝

 

在windows上,導入的iOS證書會保存到證書管理器(certmgr.msc)中   

注1:可在管理器中選中對應證書進行刪除

注2:含有私鑰的證書的左上角有一個鑰匙的小圖標

UE4使用IPhonePackager.exechs)工具來在windows上安裝iOS證書,命令如下:

"D:/UnrealEngine/Engine/Binaries/DotNET/IOS/IPhonePackager.exe" Install Engine -project "D:/svn/TPSProject/TPSProject.uproject" -certificate "D:/txjsj_dev.p12" -bundlename "com.ten.DGame"

如果有證書的pp文件,可以從證書管理器中導出p12格式的iOS證書,命令如下:

"D:/UnrealEngine/Engine/Binaries/DotNET/IOS/IPhonePackager.exe" ExportCertificate "D:/svn/TPSProject/TPSProject.uproject" "D:/DGame.mobileprovision" -outputcertificate "D:/mycertificate.p12"

注:生成出來的mycertificate.p12的密碼(在UnrealEngine\Engine\Source\Programs\IOS\iPhonePackager\CompileTime.cs的ExportCertificate函數中寫死)為:A

將D:\TPSProject\Saved\StagedBuilds\IOS中的內容重簽名並打包成D:\TPSProject\Binaries\IOS\TPSProject.ipa包(IOS遠程構建最后會執行這步來在windows上打包出ipa文件),命令如下:

D:\UnrealEngine\Engine\Binaries\DotNET\IOS\IPhonePackager.exe RepackageFromStage "D:\TPSProjec\TPSProject.uproject" -config Development -schemename TPSProject -schemeconfig "Development" -sign -codebased -stagedir "D:\TPSProject\Saved\StagedBuilds\IOS" -project "D:\TPSProjec\TPSProject.uproject" -provision "DGame.mobileprovision" -certificate "iPhone Developer: cert RDM (CFG5EWN5ME)"

擴展閱讀:udn:iPhonePackager Tool中文

UE4會在“平台” -- “iOS”中列出當前機器上安裝的所有的iOS證書和PP文件

勾選某個證書和PP文件后,會將選中的證書和PP文件的名稱記錄在DefaultEngine.ini中

[/Script/IOSRuntimeSettings.IOSRuntimeSettings]
MinimumiOSVersion=IOS_10
bSupportsPortraitOrientation=False
bSupportsUpsideDownOrientation=False
bSupportsLandscapeLeftOrientation=True
PreferredLandscapeOrientation=LandscapeLeft
MobileProvision=DGame.mobileprovision
BundleIdentifier=com.ten.DGame
SigningCertificate=iPhone Developer: cert RDM (CFG5EWN5ME)

 

App ID

App ID用於標識一個或者一組應用程序,App ID需要與應用程序的Bundle ID是一致的或者匹配的

App ID主要有以下兩種:
Explicit App ID:唯一的App ID,這種App ID用於唯一標識一個應用程序,例如com.ten.DGame,標識Bundle ID為com.ten.DGame的程序
Wildcard App ID:通配符App ID,用於標識一組應用程序。如:*可表示所有應用程序,com.*可表示以com.開頭的所有應用程序,com.ten.*可表示以com.ten開頭的所有應用程序

 

Device(設備)

Devices即設備, Devices中包含了該賬戶中所有可用的設備。 每台設備使用UDID(形如:0f3f1a4430543305f21f17cb49d0c0f3f1a44305,由40個16進制數字組成的字符串,共160 bits)來唯一標識

每個賬戶中的設備數量限制是100個,Disable一台設備也不會增加名額,只能在membership year開始的時候才能通過刪除設備來增加名額。詳見:關於iOS測試機個數上限的詳細規則

查看設備UDID

方法1:

(1)將手機通過數據線查到電腦,並在手機上信任此電腦后,就可以在iTune中查看手機的UDID

(2)如下可以看到當前手機的UDID(注:如顯示為序列號、ECID、型號識別符等,請點擊切換到UDID)

 

注:新的Mac系統(如:macOS Catalina  版本:10.15.5)已經去掉了iTune了,可從這里查看手機的UDID

 

方法2:將手機通過數據線查到電腦,並在手機上信任此電腦后,在Xcode菜單“Window” -- “Devices and Simulators”的Devices面板中查看手機的UDID

 

Provisioning Profiles(PP文件) 

Profiles即為Provisioning Profiles文件(后綴名為.mobileprovision),簡稱PP文件

PP文件包含了上述的所有內容:證書、App ID、設備,決定應用程序能在那些設備上運行

注1:PP文件也分為Development和Distribution兩種,必須與證書相對應

        即Development的PP文件要使用Development的證書,Distribution的PP文件要使用Distribution的證書

注2:Development的PP文件才允許使用xCode進行調試

注3:PP文件可以關聯多張證書,多個設備

注4:Distribution類型的PP文件又分為In House(配合企業證書使用,沒有設備限制)、Ad Hoc(只能運行在該賬戶內已登記的可用設備上,最多100個設備)、App Store(上架App Store用,沒有設備限制)

 

在打包或者在真機上運行一個應用程序,我們首先需要證書來進行簽名,用來標識這個應用程序是合法的、安全的、完整的等等;

然后需要指明它的App ID,並且驗證Bundle ID是否與其一致;再次,如果是真機調試,需要確認這台設備能否用來運行程序。

PP文件把這些信息全部打包在一起,方便我們在調試和發布程序打包時使用,這樣我們只要在不同的情況下選擇不同的profile文件就可以了

PP文件會在打包時嵌入.ipa的包里(即名為embedded.mobileprovision的文件)

在一台設備上啟動應用程序時,會用PP文件進行如下校驗:

 

Mac機器上PP文件的安裝目錄為:/Users/<用戶名>/Library/MobileDevice/Provisioning Profiles

中文路徑為:/用戶/<用戶名>/資源庫/MobileDevice/Provisioning Profiles

注:該目錄在Finder中不可見,可通過菜單“前往” -- “前往文件夾...”來打開

       或者在Terminal終端中查看  cd ~/Library/MobileDevice/Provisioning\ Profiles

注1:上圖中mobileprovision文件名中的UUID是從mobileprovision文本文件中讀取的

<key>UUID</key>
<string>672e56b7-d5e2-45a2-acc8-00f6cde47063</string>

注2:mobileprovision文件原始的文件名也存儲在mobileprovision文本文件中

<key>Name</key>
<string>PP20190723_1120</string>

注3:可以從Xcode中將Apple ID賬號中的PP文件同步到本地

在windows上,PP文件安裝目錄為:%homepath%\Appdata\Local\Apple Computer\MobileDevice\Provisioning Profiles

 

在Xcode中開發應用時,可以從項目工程中設置其使用的PP文件,讓其對ipa文件進行簽名輸出(CodeSign)

注1:點擊Provisioning Profile后面的上下箭頭,會彈出快捷菜單

Import Profile:可導入本地的一個PP文件到PP文件的安裝目錄

Download Profile:若在Xcode中登錄了Apple ID賬號,會列出賬號中擁有的PP文件

注2:也可以勾選“Automatically manage signing”,讓Xcode來自動管理

注3:當在Xcode中登錄了Apple ID賬號,“Automatically manage signing”下可以看到一個iOS Team Provisioning Profile的PP文件 

         該PP文件為Development類型,是利用Apple ID賬號中的最大范圍的App ID + 所有的證書 + 所有設備自動生成出來的

         鼠標放在該PP文件圖標上拖曳到Terminal終端中可以看到該PP文件存放的路徑,如:/Users/<用戶>/Library/MobileDevice/Provisioning\ Profiles/d563efb3-d555-4921-81eb-c9a32ddac164.mobileprovision

         將安裝目錄中的該文件刪除,然后在Xcode中登錄Apple ID賬號並勾選“Automatically manage signing”,會強制利用Apple ID賬號中的資源重新生成出最新的iOS Team Provisioning Profile的PP文件

 

更詳細地設置在BuildSetting中

 

Keys(extra service)

 Keys定義了開啟了那些Service,如上DGame該值為2,代表開啟了Apple Push Notifications service (APNs)和DeviceCheck服務

Apple Push Notifications service (APNs)
Establish connectivity between your notification server and the Apple Push Notification service. One key is used for all of your apps. 
DeviceCheck
Access per-device, per-developer data that your associated server can use in its business logic. One key is used for all of your apps. 

 

其他

Xcode中共享developerprofile來共享Apple ID賬號

(1)在Xcode登錄Apple ID賬號,點擊左下角螺母圖標,彈出快捷菜單“Export Apple ID and Code Signing Assets”輸入保護密碼后,就可導出開發者賬號(*.developerprofile)

(2)在其他機器上對應位置的快捷菜單“Import Apple ID and Code Signing Assets”輸入保護密碼來導入該文件

注:developerprofile文件實際為一個zip文件,改后綴解壓后,里面文件列表如下:

 

參考

How to Submit An App to Apple: From No Account to App Store Part1

How to Submit An App to Apple: From No Account to App Store Part2

關於Certificate、Provisioning Profile、App ID的介紹及其之間的關系

iOS App 簽名的原理 

(轉)細說iOS代碼簽名(一)

(轉)細說iOS代碼簽名(二)

(轉)細說iOS代碼簽名(三)

(轉)細說iOS代碼簽名(四)

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM