iOS 中的代碼簽名(二)—— 代碼簽名的實際過程

在上一篇iOS 中的代碼簽名(一)—— 數字簽名基本概念中,咱們簡單解釋了數字簽名、證書的基本概念以及實際做用,在這一篇,咱們主要結合應用的上傳過程來講說代碼簽名的實際過程。html

1. 獲取 signing identity 與證書

首先在咱們的系統鑰匙串的系統根證書列表中,是存在着蘋果的 Root CA 簽發的根證書的。ios

蘋果根證書圖片

在咱們第一次打開 Xcode 的時候,Xcode 會在系統的鑰匙串中添加蘋果的『Apple Worldwide Developer Relations Certification Authority』,這個證書是被根證書信任的,這樣咱們就創建了可信的證書信任鏈。vim

Apple Worldwide Developer Relations Certification Authority 圖片

在蘋果的官方文檔中,將數字簽名用到的公鑰和私鑰統稱爲 Signing Indetity,在 iOS 的打包發佈過程當中,咱們首先須要作的就是去生成公鑰私鑰並從蘋果那裏得到證書。segmentfault

首先,咱們須要建立公鑰和私鑰,在 OSX 中咱們能夠經過鑰匙串訪問的證書助理建立一個CertificateSigningRequest.certSigningRequest文件,當這個文件穿件完畢後,鑰匙串中的密鑰項目中就會多出一對公鑰和私鑰。此時的公鑰和私鑰仍是孤立的狀態。安全

鑰匙串的圖片

CertificateSigningRequest.certSigningRequest文件的內容也很簡單,就是咱們剛剛建立好的公鑰內容。(使用 vim 打開查看,實際上的公鑰和私鑰通常都是這樣子的一串很長的字符序列)bash

enter image description here

接下來咱們要作的就是把這個文件上傳到蘋果的 MemberCenter (簡稱 MC 哈),而後 MC 會利用咱們的公鑰和我的信息生成對應的證書。咱們接下來點擊下載並雙擊證書,在鑰匙串裏頭就會把證書和對應的公鑰私鑰進行關聯。app

公鑰私鑰關聯的圖片

這樣,咱們就擁有了屬於咱們本身的,獨一無二的 signing identity。ide

流程圖片

2. 建立 Provisioning Profile

當咱們成功建立證書之後,咱們通常還須要在蘋果的 MC 上添加咱們 APP 的 bundle ID 和設備的 UUID,最後咱們須要在 MC 上針對證書、bundle ID 、bundle ID 對應的能力以及對應的設備進行配置,最終生成一個mobileprovision文件,這個文件的細節咱們將會在下一篇進行講解,如今咱們先記住這個文件中保存了咱們建立的證書列表就好。ui

3. 對代碼的產物進行簽名

當咱們完成開發後,會使用 Xcode 的 Archive(存檔) 的功能進行打包,當咱們點擊了 Archive 之後,Xcode 就會對咱們的代碼進行編譯和連接,最終產生一個後綴爲.app文件(嚴格意義上來講這是一個文件夾,是 Mac 上的包文件,終端裏頭是把這個文件當作文件夾對待的)。而後 Xcode 會把對應的mobileprovision文件拷貝到 APP 文件中(這個文件就是咱們在前面配置 provision profile 後下載下來的文件),這一步的詳情能夠在 Archive 的 log 中的『Process product packaging』這一步中看到;再以後,Xcode 會使用codesign這個命令對 APP 文件進行簽名。spa

Archive 的 log 圖片

若是咱們有多個 Signing Identity,咱們也能夠在工程『Build Settings』選項中進行配置

build settings 配置

那具體codesign命令是如何進行簽名的呢?一個沒有被簽名的 APP 文件的結構相似這樣:

TestOC.app
├── Base.lproj
│   ├── LaunchScreen.storyboardc
│   │   ├── 01J-lp-oVM-view-Ze5-6b-2t3.nib
│   │   ├── Info.plist
│   │   └── UIViewController-01J-lp-oVM.nib
│   └── Main.storyboardc
│       ├── BYZ-38-t0r-view-8bC-Xf-vdC.nib
│       ├── Info.plist
│       └── UIViewController-BYZ-38-t0r.nib
├── Info.plist
├── PkgInfo
├── TestOC(二進制文件)
└── embedded.mobileprovision

codesign 在對 APP 文件進行簽名的時候,會把對應的簽名直接添加到二進制文件的內部,而針對資源文件則是利用一個叫作 『CodeResources』的 plist 文件把對應的資源文件和數字簽名進行記錄。簽名結束後的 APP 文件的內容以下:

TestOC.app
├── Base.lproj
│   ├── LaunchScreen.storyboardc
│   │   ├── 01J-lp-oVM-view-Ze5-6b-2t3.nib
│   │   ├── Info.plist
│   │   └── UIViewController-01J-lp-oVM.nib
│   └── Main.storyboardc
│       ├── BYZ-38-t0r-view-8bC-Xf-vdC.nib
│       ├── Info.plist
│       └── UIViewController-BYZ-38-t0r.nib
├── Info.plist
├── PkgInfo
├── TestOC
├── _CodeSignature
│   └── CodeResources
└── embedded.mobileprovision

最後,咱們可使用 Xcode 打包生成對應的 ipa ,方便以後安裝到設備上。

4. iOS 設備進行驗證

在 iOS 設備這一端,蘋果的相關證書在出廠設置系統的時候就已經設置好了,因此能夠認爲其和蘋果的通訊是安全的。iOS 設備在獲得 ipa 以後,首先會把 ipa 進行解壓,而後經過 APP 文件中的 mobileprovision 文件去下載其對應的證書,而後從證書中取得開發者的公鑰,從而對 ipa 進行了數字簽名的認證。

參考

相關文章
相關標籤/搜索