iOS 开发者证书的底层原理
??在日常iOS開發中,都會遇到各種的證書、簽名有關的問題。如果你只是一個人開發,你擁有開發者最高權限,參考網上的教程可以輕松的解決證書、簽證等問題開發;但是如果你是在一個Team中,簽名、證書就會出現各種各樣的問題,影響你的調試、打包和上傳,而開發者證書的底層原理你花一些時間去深入的理解,讓你在遇到證書相關的問題游刃有余。
一、基本概念
??在計算機世界里Apple開發者證書并不是獨立于任何系統單獨存在的,而是由證書頒發機構(CA,Certificate Authority)即頒發數字證書的機構認證的一個證書頒發機構。
??CA中心為每個使用公開密鑰的用戶發放一個數字證書,數字證書的作用是證明證書中列出的用戶合法擁有證書中列出的公開密鑰。CA機構的數字簽名使得攻擊者不能偽造和篡改證書。在SET交易中,CA不僅對持卡人、商戶發放證書,還要對獲款的銀行、網關發放證書。
??證書實際是由證書簽證機關(CA)簽發的對用戶的公鑰的認證。證書的內容包括:電子簽證機關的信息、公鑰用戶信息、公鑰、權威機構的簽字和有效期等等。
總結上邊的內容,簡單來講,證書底層原理就涉及兩個關鍵概念:
- 數字簽名
- 數字證書
數字簽名
??數字簽名(又稱公鑰數字簽名) 是只有信息的發送者才能產生的別人無法偽造的一段數字串,這段數字串同時也是對信息的發送者發送信息真實性的一個有效證明。
在數字簽名技術中,有兩種行為:
- 簽名生成
- 簽名驗證
在數字簽名技術中,有常用的兩種實現算法:
1.有哈希算法的數字簽名與驗證
??哈希函數是一種“壓縮函數”,利用哈希函數可以把任意長度的輸入經由散列函數算法變換成固定長度的輸出,該輸出的哈希值就是消息摘要,也稱數字摘要。在正式的數字簽名中,發送方首先對發送文件采用哈希算法,得到一個固定長度的消息摘要( Message Digest);再用自己的私鑰( Secret key,SK)對消息摘要進行簽名,形成發送方的數字簽名。數字簽名將作為隊件和原文一起發送給接收方;接收方首先用發送方的公鑰對數字簽名進行解密得到發送方的數字摘要,然后用相同的哈希函數對原文進行哈希計算,得到一個新的消息摘要,最后將消息摘要與收到的消息摘要做比較。
2.基于非對稱密鑰加密體制的數字簽名與驗證
??發送方首先將原文用自己的私鑰加密得到數字簽名,然后將原文和數字簽名一起發送給接收方。接收方用發送方的公鑰對數字簽名進行解密,最后與原文進行比較,數字簽名采用了規范化的程序和科學化的方法,用于鑒定簽名人的身份以及對一項電子數據內容的認可。使用數字簽名技術能夠驗證文件的原文在傳輸過程中有無變動,確保傳輸電子文件的完整性、真實性和不可抵賴性。

數字證書
數字證書(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):子證書
- Apple Worldwide Developer Relations Certification Authority:中間證書
二、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文件)
2.1保存到本地的證書文件(CSR文件)
2.2從KeyChain中可以生成的一對private Key 和 Public 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對應的 Devices 、App ID(包含Entitlements)。
3.在創建 Provisioning Profile 中, Provisioning Profile 分別對Certificate 、Devices 、App ID(包含Entitlements)一起的數據用私鑰A進行簽名,生成Provisioning Profile(即描述文件),下載安裝到Mac電腦。
4.iOS項目編譯完之后生成.app文件,在.app文件中含有Provisioning Profile描述文件 (embedded.moblieprovision 描述文件) + 安裝包 + 其他信息。
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 開發之中。當我們在開發中遇到簽名、證書相關的問題時,我們只要結合證書幕后的原理,很容易就能找到解決辦法。
總結
以上是生活随笔為你收集整理的iOS 开发者证书的底层原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用有限元数值模拟技术辅助静电场学习
- 下一篇: 果壳的“分答”