iOS逆向 09:應用簽名

iOS 底層原理 + 逆向 文章匯總

本文主要講解什么是代碼簽名,以及iOS中的應用簽名

代碼簽名

代碼簽名是對可執行文件或腳本進行數字簽名.用來確認軟件在簽名后未被修改或損壞的措施。和數字簽名原理一樣,只不過簽名的數據是代碼而已.

目的:防止可執行文件或腳本被篡改

簡單的代碼簽名

  • 在iOS出來之前,以前的主流操作系統(Mac/Windows)軟件隨便從哪里下載都能運行,系統安全存在隱患,盜版軟件,病毒入侵,靜默安裝等等.那么蘋果希望解決這樣的問題,要保證每一個安裝到 iOS 上的 APP 都是經過蘋果官方允許的,怎樣保證呢?就是通過代碼簽名。

  • 如果要實現驗證.其實最簡單的方式就是通過蘋果官方生成非對稱加密的一對公私鑰.在iOS的系統中內置一個公鑰,私鑰由蘋果后臺保存,我們傳APP到AppStore時,蘋果后臺用私鑰對APP數據進行簽名,iOS系統下載這個APP后,用公鑰驗證這個簽名,若簽名正確,這個APP肯定是由蘋果后臺認證的,并且沒有被修改過,也就達到了蘋果的需求:保證安裝的每一個APP都是經過蘋果官方允許的.

  • 如果我們iOS設備安裝APP只從App Store這一個入口這件事就簡單解決了,沒有任何復雜的東西,一個數字簽名搞定.

  • 但是實際上iOS安裝APP還有其他渠道.比如對于我們開發者iOSer而言,我們是需要在開發APP時直接真機調試的.而且蘋果還開放了企業內部分發的渠道,企業證書簽名的APP也是需要順利安裝的.

  • 蘋果需要開放這些方式安裝APP,這些需求就無法通過簡單的代碼簽名來辦到了。

蘋果的需求

  • 安裝包不需要上傳AppStore,可以直接安裝到手機

  • 蘋果為了保證系統的安全性,又必須對安裝的App有絕對的控制權

    • 經過蘋果允許才可以安裝
    • 不能被濫用導致非開發App也能被安裝

為了實現這些需求,iOS簽名的復雜度也就開始增加了,蘋果這里給出的方案是 雙層簽名

雙層代碼簽名

為了實現蘋果驗證應用的一些需求,iOS簽名的復雜度也就開始增加了,蘋果給出的方案是雙層簽名.

  • iOS的雙層代碼簽名流程這里簡單梳理一下,這也不是最終的iOS簽名原理.iOS的最終簽名在這個基礎上還要稍微加點東西.

  • 首先這里有兩個角色.一個是iOS系統 還有一個就是我們的Mac系統.因為iOS的APP開發環境在Mac系統下.所以這個依賴關系成為了蘋果雙層簽名的基礎.

  • 1、在Mac系統中生成非對稱加密算法的一對公鑰\私鑰(你的Xcode幫你代辦了).這里稱為公鑰M 私鑰M (注:M = Mac)

  • 2、蘋果自己有固定的一對公私鑰,跟之前App Store原理一樣,私鑰在蘋果后臺,公鑰在每個iOS系統中.這里稱為公鑰A , 私鑰A. A=Apple

  • 3、把公鑰M 以及一些你開發者的信息,傳到蘋果后臺(這個就是CSR文件),用蘋果后臺里的私鑰 A 去簽名公鑰M。得到一份數據包含了公鑰M 以及其簽名,把這份數據稱為證書。

    雙重簽名圖示

蘋果雙向簽名驗證步驟

下面簡述蘋果雙向簽名的步驟

  • 1、前提:


    蘋果雙向簽名驗證流程-01
    • xcode會在keychain生成一對公鑰M、私鑰M,保存在mac電腦中
    • 還有一對公鑰A(iPhone)、私鑰A(蘋果服務端)
  • 2、通過mac中的公鑰M(核心)+證書頒發機構信息,生成一個CSR文件,傳遞給蘋果服務器

    蘋果雙向簽名驗證流程-02

  • 3、蘋果服務器通過私鑰A加密公鑰M,生成一個證書,其中包含公鑰M+Hash值,并對公鑰M的Hash值作數字簽名

    蘋果雙向簽名驗證流程-03

    • 私鑰A 加密 公鑰M

    • 蘋果服務器就相當于CA機構

    • 證書就是 CRT文件

問題:編譯App需要安裝到手機,iPhone如何驗證呢?

  • 4、通過mac中的私鑰M,對App中的Mach-O進行簽名,生成一個App的簽名,同時將證書打包進去,形成一個ipa包
    • 1)通過mac中的私鑰M,對App中的Mach-O進行簽名
      蘋果雙向簽名驗證流程-04
    • 2)生成一個App的簽名


      蘋果雙向簽名驗證流程-05
    • 3)將Mach-O文件、App簽名、證書等信息一起打包,形成一個ipa包


      蘋果雙向簽名驗證流程-06
    • 證書 可以由 iPhone中的公鑰A解密
    • 私鑰M 就是 p12證書,證書回來后,就會與私鑰M進行綁定

雙重驗證

  • 5、通過iPhone的公鑰A 解密 證書,證書解密后得到公鑰M公鑰M 可以驗證 App的簽名,驗證通過,說明安裝行為是被允許的,合法的
    蘋果雙向簽名驗證流程-07

    以下是Mach-O的簽名信息
    蘋果雙向簽名驗證流程-08

注:上述這個過程是有問題的:因為只要申請證書,任何設備都可以安裝

描述文件

所以蘋果為了解決應用濫用的問題,所以蘋果又加了兩個限制.

  • 第一限制在蘋果后臺注冊過的設備才可以安裝.

  • 第二限制簽名只能針對某一個具體的APP.

并且蘋果還想控制App里面的iCloud/PUSH/后臺運行/調試器附加這些權限,所以蘋果把這些權限開關統一稱為Entitlements(授權文件).并將這個文件放在了一個叫做Provisioning Profile(描述文件)文件中.

  • 描述文件是在AppleDevelop網站創建的(在Xcode中填上AppleID它會代辦創建),Xcode運行時會打包進入APP內.所以我們使用CSR申請證書時,我們還要申請一個東西!! 就是描述文件!

  • 在開發時,編譯完一個 APP 后,用本地的私鑰M對這個APP進行簽名,同時把從蘋果服務器得到的 Provisioning Profile 文件打包進APP里,文件名為embedded.mobileprovision,把 APP 安裝到手機上.最后系統進行驗證。

  • 6、為了限制,蘋果提供了一個權限文件,即profile - 描述文件,所以3中的證書是包含在描述文件中的。除此之外還包含 設備id、AppID、權限文件等信息,其目的有兩個:1)限制免費證書安裝設備;2)限制免費證書安裝期限,以下是加上描述文件后的雙重驗證過程

    蘋果雙向簽名驗證流程-09

    • 1)蘋果服務器提供了一個描述文件,其中包含CRT證書

    • 2)然后通過mac的私鑰MMach-O文件進行簽名,生成App簽名

    • 3)將Mach-O文件、App簽名、描述文件一起打包生成ipa

    • 4)將App安裝到iOS設備中

    • 5)通過iPhone手機的私鑰A解密描述文件中的CRT證書,解密后得到公鑰M

    • 6)然后通過公鑰M驗證App的簽名。因為App簽名是通過私鑰M進行簽名的,如果驗證通過,則說明安裝是合法的

下面老看下描述文件,以下是描述文件的期限

蘋果雙向簽名驗證流程-10

且在編譯好的App包中,同樣可以看到描述文件
蘋果雙向簽名驗證流程-11

終端命令查看:通過命令查看描述文件(.app包的目錄下):security cms -D -i embedded.mobileprovision

雙重驗證總結

所以,綜上所述,蘋果的雙重驗證主要是指以下兩次簽名驗證:

  • 1、iOS系統中通過內置的公鑰A驗證CRT證書

  • 2、通過1中證書取出的公鑰M驗證App的簽名

總結

  • 證書公鑰M/私鑰M發出去,由官方的機構對其進行簽名后組成的數據包

  • p12 就是本地私鑰M

  • 描述文件:包含證書、權限文件(Entitlements - 權限開關)、UUID等信息+權限。不能修改

  • 證書生成流程:

    • 1、通過本地的公鑰M/私鑰M,申請證書 -- CSR文件

    • 2、服務器將公鑰M進行一次RSA加密,得到CRT證書

    • 3、將CRT證書下載到本地,與私鑰M(p12)進行綁定

  • 蘋果雙向簽名驗證流程如下圖所示


    蘋果雙向簽名驗證流程
    • 1、在Mac中通過公鑰M+證書頒發機構信息生成CSR文件

    • 2、將CSR文件傳遞到蘋果服務器,申請CRT證書

    • 3、蘋果服務器通過私鑰A加密公鑰M,生成CRT證書,并對公鑰M的hash值進行數字簽名(即通過RSA加密)。同時蘋果還提供了描述文件

    • 4、通過私鑰MMach-O進行簽名,生成一個App的簽名,同時將描述文件、CRT證書等打包,形成一個ipa

    • 5、App安裝到iOS設備

    • 6、從iPhone手機中獲取公鑰A,通過公鑰A解密CRT證書,得到公鑰M

    • 7、通過6中得到公鑰M驗證App的簽名

  • 蘋果的雙重驗證主要是指以下兩次簽名驗證:

    • 1、iOS系統中通過內置的公鑰A驗證CRT證書

    • 2、通過1中證書取出的公鑰M驗證App的簽名

參考鏈接

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容