在上一篇iOS 中的代碼簽名(一)—— 數字簽名基本概念中,咱們簡單解釋了數字簽名、證書的基本概念以及實際做用,在這一篇,咱們主要結合應用的上傳過程來講說代碼簽名的實際過程。html
首先在咱們的系統鑰匙串的系統根證書列表中,是存在着蘋果的 Root CA 簽發的根證書的。ios
在咱們第一次打開 Xcode 的時候,Xcode 會在系統的鑰匙串中添加蘋果的『Apple Worldwide Developer Relations Certification Authority』,這個證書是被根證書信任的,這樣咱們就創建了可信的證書信任鏈。vim
在蘋果的官方文檔中,將數字簽名用到的公鑰和私鑰統稱爲 Signing Indetity,在 iOS 的打包發佈過程當中,咱們首先須要作的就是去生成公鑰私鑰並從蘋果那裏得到證書。segmentfault
首先,咱們須要建立公鑰和私鑰,在 OSX 中咱們能夠經過鑰匙串訪問的證書助理建立一個CertificateSigningRequest.certSigningRequest
文件,當這個文件穿件完畢後,鑰匙串中的密鑰項目中就會多出一對公鑰和私鑰。此時的公鑰和私鑰仍是孤立的狀態。安全
而CertificateSigningRequest.certSigningRequest
文件的內容也很簡單,就是咱們剛剛建立好的公鑰內容。(使用 vim 打開查看,實際上的公鑰和私鑰通常都是這樣子的一串很長的字符序列)bash
接下來咱們要作的就是把這個文件上傳到蘋果的 MemberCenter (簡稱 MC 哈),而後 MC 會利用咱們的公鑰和我的信息生成對應的證書。咱們接下來點擊下載並雙擊證書,在鑰匙串裏頭就會把證書和對應的公鑰私鑰進行關聯。app
這樣,咱們就擁有了屬於咱們本身的,獨一無二的 signing identity。ide
當咱們成功建立證書之後,咱們通常還須要在蘋果的 MC 上添加咱們 APP 的 bundle ID 和設備的 UUID,最後咱們須要在 MC 上針對證書、bundle ID 、bundle ID 對應的能力以及對應的設備進行配置,最終生成一個mobileprovision
文件,這個文件的細節咱們將會在下一篇進行講解,如今咱們先記住這個文件中保存了咱們建立的證書列表就好。ui
當咱們完成開發後,會使用 Xcode 的 Archive(存檔) 的功能進行打包,當咱們點擊了 Archive 之後,Xcode 就會對咱們的代碼進行編譯和連接,最終產生一個後綴爲.app
文件(嚴格意義上來講這是一個文件夾,是 Mac 上的包文件,終端裏頭是把這個文件當作文件夾對待的)。而後 Xcode 會把對應的mobileprovision
文件拷貝到 APP 文件中(這個文件就是咱們在前面配置 provision profile 後下載下來的文件),這一步的詳情能夠在 Archive 的 log 中的『Process product packaging』這一步中看到;再以後,Xcode 會使用codesign
這個命令對 APP 文件進行簽名。spa
若是咱們有多個 Signing Identity,咱們也能夠在工程『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 ,方便以後安裝到設備上。
在 iOS 設備這一端,蘋果的相關證書在出廠設置系統的時候就已經設置好了,因此能夠認爲其和蘋果的通訊是安全的。iOS 設備在獲得 ipa 以後,首先會把 ipa 進行解壓,而後經過 APP 文件中的 mobileprovision 文件去下載其對應的證書,而後從證書中取得開發者的公鑰,從而對 ipa 進行了數字簽名的認證。