iOS 開發者證書的底層原理

  在日常iOS開發中,都會遇到各種的證書、簽名有關的問題。如果你只是一個人開發,你擁有開發者最高權限,參考網上的教程可以輕鬆的解決證書、簽證等問題開發;但是如果你是在一個Team中,簽名、證書就會出現各種各樣的問題,影響你的調試、打包和上傳,而開發者證書的底層原理你花一些時間去深入的理解,讓你在遇到證書相關的問題遊刃有餘。

一、基本概念

  在計算機世界裏Apple開發者證書並不是獨立於任何系統單獨存在的,而是由證書頒發機構(CA,Certificate Authority)即頒發數字證書的機構認證的一個證書頒發機構

  CA中心爲每個使用公開密鑰的用戶發放一個數字證書,數字證書的作用是證明證書中列出的用戶合法擁有證書中列出的公開密鑰。CA機構的數字簽名使得攻擊者不能僞造和篡改證書。在SET交易中,CA不僅對持卡人、商戶發放證書,還要對獲款的銀行、網關發放證書。

  證書實際是由證書籤證機關(CA)簽發的對用戶的公鑰的認證。證書的內容包括:電子簽證機關的信息、公鑰用戶信息、公鑰、權威機構的簽字和有效期等等。

總結上邊的內容,簡單來講,證書底層原理就涉及兩個關鍵概念:

  • 數字簽名
  • 數字證書

數字簽名

  數字簽名(又稱公鑰數字簽名) 是隻有信息的發送者才能產生的別人無法僞造的一段數字串,這段數字串同時也是對信息的發送者發送信息真實性的一個有效證明。

在數字簽名技術中,有兩種行爲:

  • 簽名生成
  • 簽名驗證

在數字簽名技術中,有常用的兩種實現算法:

1.有哈希算法的數字簽名與驗證

  哈希函數是一種“壓縮函數”,利用哈希函數可以把任意長度的輸入經由散列函數算法變換成固定長度的輸出,該輸出的哈希值就是消息摘要,也稱數字摘要。在正式的數字簽名中,發送方首先對發送文件採用哈希算法,得到一個固定長度的消息摘要( Message Digest);再用自己的私鑰( Secret key,SK)對消息摘要進行簽名,形成發送方的數字簽名。數字簽名將作爲隊件和原文一起發送給接收方;接收方首先用發送方的公鑰對數字簽名進行解密得到發送方的數字摘要,然後用相同的哈希函數對原文進行哈希計算,得到一個新的消息摘要,最後將消息摘要與收到的消息摘要做比較。

HASH

2.基於非對稱密鑰加密體制的數字簽名與驗證

  發送方首先將原文用自己的私鑰加密得到數字簽名,然後將原文和數字簽名一起發送給接收方。接收方用發送方的公鑰對數字簽名進行解密,最後與原文進行比較,數字簽名採用了規範化的程序和科學化的方法,用於鑑定簽名人的身份以及對一項電子數據內容的認可。使用數字簽名技術能夠驗證文件的原文在傳輸過程中有無變動,確保傳輸電子文件的完整性、真實性和不可抵賴性。

![非對稱RSA算法![](https://img-blog.csdnimg.cn/20200414142607443.jpeg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0Z1dHVyZV9PbmU=,size_16,color_FFFFFF,t_70)

數字證書

數字證書(Digital Certificate) 是一種相當於現實世界中身份證的功能在數字信息領域中的實現。數字證書包含了個人或機構的 身份信息 及其 公鑰,因此也稱爲 公鑰證書(Public-Key Certificate,PKC)。

首先去KeyChain(鑰匙串訪問),查看一下安裝的開發者證書的信息。證書
根據證書頒發的機構Apple Worldwide Developer Relations Certification Authority在鑰匙串中找到證書如下的證書關係:
證書的關係
  根證書 Apple Root Certificate Authority 是在 MacOS 操作系統安裝時內置的,是 Apple Root CA 自行頒發的。

  中間證書 Apple World Developer Relations Certificate Authority (實際文件爲 AppleWWDRCA.cer)是在Xcode 安裝時內置的,是 Apple Root CA 頒發的。雖然 AppleWWDRCA.cer 是中間證書,但是對於 iOS 開發分類來說,它就是 開發根證書。

Mac電腦上開發者的證書的關係:

  • Apple Root CA(Apple Certification Authority):根證書
    • Apple Worldwide Developer Relations Certification Authority:中間證書
      • iPhone Developer: Jack Wangle(XXXXXXX):子證書

二、Certificates 的申請

Certificate是用來給應用程序簽名的,只有經過簽名的應用程序才能保證他的來源是可信任的,並且代碼是完整的、未經修改的。證書的後綴爲.cer

在我們申請證書前,需要先申請一個CSR(即Certificate Signing Request)文件,此過程實際上是生成一對密鑰(即公鑰和私鑰),這對密鑰將保存在開發者Mac電腦的Keychain(即鑰匙串訪問)中,CSR文件中則包含公鑰。具體操作如下:

證書類型有很多種,這裏簡單介紹一下常見的:

  • iOS App Development(即開發證書),用於開發和真機調試app

  • iOS Distribution (App Store and Ad Hoc)(即分發證書),用於蘋果應用市場(App Store)和內部分發渠道(Ad Hoc)

  • APNS(Apple Push Notification Service,即蘋果推送證書),用於推送通知到app。

    • 與開發證書和分發證書不同的是,APNS與App ID有關。
    • APNS有兩種證書,分別是用於開發環境的 iOS Apple Push Notification service SSL (Sandbox),以及用於生產環境的 Apple Push Notification service SSL (Sandbox & Production)。如果你的app有推送服務,這兩種推送證書都是需要創建的
1.打開KeyChain(鑰匙串訪問)—>證書助手---->從證書頒發機構請求證書…

申請證書

2.保存從CA請求的證書(CSR文件)

CA證書
2.1保存到本地的證書文件(CSR文件)
證書
2.2從KeyChain中可以生成的一對private Key 和 Public Key
Key

3.創建開發者證書,上傳需要的CSR文件,由Apple CA進行簽名生成開發者證書。

在這裏插入圖片描述

4.下載生成的證書到Mac本地,雙擊安裝即可。

介紹:

p12文件

p12文件更確切的說:p12證書,因爲其本身就是一個加密的證書,後綴爲.p12。開發者將CSR文件發給蘋果服務器,由此蘋果服務器會生成Certificate文件(含公鑰),接着開發者將其下載到本地,再導入鑰匙串中後,就可以從鑰匙串中導出p12證書。顯然,p12文件裏面有匹配的公鑰和私鑰。

三、創建 Identifiers & Device & Profiles

1.Identifiers創建App ID

App ID用於標識一個或者一組App。主要有兩種:

  • Explicit App ID:是app的唯一標識符,它由蘋果爲開發者創建的team id和app的bundle id組成。每個app都會有且僅有一個明確的Explicit App ID。
  • Wildcard App ID:即通配符App ID,用於標識一組app,以*結束,如com.company.*標識以com.company開頭的所有應用程序。
    在這裏插入圖片描述

2.Device創建

Devices中包含了蘋果開發者賬號中所有可用於開發和測試的設備,每臺設備使用UDID來唯一標識。
在這裏插入圖片描述

3.Provisioning Profile(描述文件)創建

一個描述文件包含了App ID、Certificate、Device,其後綴爲.mobileprovision。常用的有:

  • iOS App Development,用於開發時的真機調試,包含App ID、證書和設備
  • Ad Hoc,用於分發時的真機調試,同樣包含App ID、證書和設備
  • App Store,用於分發到蘋果應用市場,包含App ID和證書,與設備無關,且所有能訪問App Store的蘋果設備均可下載安裝app。

描述文件的作用主要是:

  • 限制只有在蘋果後臺註冊過的設備纔可以安裝
  • 限制簽名只能針對某一個具體的App

描述文件中還包含Entitlements(權限信息),權限信息指明瞭app使用的蘋果服務,如iCloud權限、推送、蘋果內購等。

1.選擇Provisioning Profile的類型

在這裏插入圖片描述

2.Provisioning Profile選擇對應的Identity的Apple ID

在這裏插入圖片描述

3.選擇對應的證書文件

在這裏插入圖片描述

4.選擇Device設備

在這裏插入圖片描述

5.填寫創建的Provisioning Profile文件的名字

在這裏插入圖片描述

6.下載Profile文件

四、iOS簽名的原理

1.iOS證書申請的基本原理

  • 開發者在本地生成密鑰對,並提供開發者的身份信息。
  • 將密鑰對中的公鑰、身份信息發送給 CA。
  • CA 使用 CA 私鑰對開發者的公鑰、身份信息進行簽名。
  • CA 將開發者的公鑰、身份信息、簽名組裝成證書以供下載。在這裏插入圖片描述

2.iOS證書申請的基本原理

在這裏插入圖片描述
解釋說明:

  • 1.蘋果官方有多對密鑰,即私鑰和公鑰
  • 2.生成CRS文件時,證書助手使用Apple Worldwide Developer Relations Certification Authority證書中的公鑰對生成的一對密鑰(公鑰M、私鑰M)中的公鑰M以及對應的電腦上的開發認證信息發送給蘋果服務器。(Mac電腦和蘋果之間存在的一對鑰匙串在圖上並沒有顯示)
  • 3.創建證書之前,生成CRS文件是,創建的在Mac電腦上的密鑰(記作:密鑰M:公鑰M、私鑰M)
  • 4.蘋果和IPhone手機之間存在一對密鑰(記作:密鑰A:公鑰A、私鑰A)

下方詳細分析一下iOS的簽名原理(簽名和驗證):

1.創建證書前的準備工作,首先通過鑰匙串申請一個CRS文件,同時生成一對非對稱加密密鑰,也就是如上圖的: 私鑰M公鑰M,會把公鑰M 和 Mac上的證書信息(Apple Worldwide Developer Relations Certification Authority)放在CSR文件中

2.上傳CSR文件發送給蘋果服務器,用於申請證書,蘋果服務器使用 蘋果私鑰A 對接收到的 公鑰M + 信息進行簽名。生成Certificate文件(文件後綴名:.cer),並下載到本地安裝。並創建App對應的 DevicesApp ID(包含Entitlements)

3.在創建 Provisioning Profile 中, Provisioning Profile 分別對CertificateDevicesApp ID(包含Entitlements)一起的數據用私鑰A進行簽名,生成Provisioning Profile(即描述文件),下載安裝到Mac電腦。

4.iOS項目編譯完之後生成.app文件,在.app文件中含有Provisioning Profile描述文件 (embedded.moblieprovision 描述文件) + 安裝包 + 其他信息。
.app文件中的證書文件

iOS安裝包 .ipa文件解壓之後的文件目錄:(最終安裝包.app和編譯後的.app一致)

.ipa 解壓之後的文件目錄
在這裏插入圖片描述
XCode先使用私鑰M對.app進行簽名,然後,把.app和描述文件一起壓縮成安裝包.ipa文件。是對資源文件的簽名,生成的簽名文件名爲CodeResources,存放在.app目錄下的_CodeSignature文件夾中。
5.XCode準備把安裝包安裝在蘋果設備(如iPhone)上。

6.iPhone對安裝包進行驗證,即用 公鑰A 驗證描述文件中的簽名。驗證通過則說明描述文件裏的數據是蘋果授權的。

7.當第【6】步驗證通過後,再用公鑰A驗證證書中的簽名。驗證通過則說明公鑰M是安全可信任的。

8.第【7】步驗證通過後,就可以取出描述文件裏的數據做各種驗證,包括用公鑰M驗證App簽名,驗證iPhone是否在設備列表中,App ID是否對得上,使用的權限是否跟Entitlements對應等。當這些全部驗證通過,iPhone就可以安裝app了。

以上就是iOS簽名的流程,分析了蘋果用了兩對非對稱加密密鑰,進行的是雙重驗證,基本保證了XCode真機調試的安全性,確保app的安裝行爲是受到蘋果管控的。

總結

非對稱加密貫穿於 iOS 開發之中。當我們在開發中遇到簽名、證書相關的問題時,我們只要結合證書幕後的原理,很容易就能找到解決辦法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章