1. 程式人生 > >漫談iOS程式的證書和簽名機制

漫談iOS程式的證書和簽名機制

接觸iOS開發半年,曾經也被這個主題坑的摸不著頭腦,也在淘寶上買過企業證書籤名這些服務,有大神都做了一個全自動的釋出打包(不過此大神現在不賣企業證書了),甚是羨慕和崇拜。於是,花了一點時間去研究了一下iOS這套證書和簽名機制,並撰文分享給需要的朋友。由於本人才疏學淺,多有遺漏或錯誤之處,還請大神多多指教。

非對稱加密和摘要

非對稱加密的特性和用法

非對稱加密演算法可能是世界上最重要的演算法,它是當今電子商務等領域的基石。簡而言之,非對稱加密就是指加密金鑰和解密金鑰是不同的,而且加密金鑰和解密金鑰是成對出現。非對稱加密又叫公鑰加密,也就是說成對的金鑰,其中一個是對外公開的,所有人都可以獲得,稱為公鑰,而與之相對應的稱為私鑰,只有這對金鑰的生成者才能擁有。公私鑰具有以下重要特性:

  • 對於一個私鑰,有且只有一個與之對應的公鑰。生成者負責生成私鑰和公鑰,並儲存私鑰,公開公鑰

  • 公鑰是公開的,但不可能通過公鑰反推出私鑰,或者說極難反推,只能窮舉,所以只要金鑰足夠長度,要通過窮舉而得到私鑰,幾乎是不可能的

  • 通過私鑰加密的密文只能通過公鑰解密,公鑰加密的密文只有通過私鑰解密

由於上述特性,非對稱加密具有以下的典型用法:

  • 對資訊保密,防止中間人攻擊:將明文通過接收人的公鑰加密,傳輸給接收人,因為只有接收人擁有對應的私鑰,別人不可能擁有或者不可能通過公鑰推算出私鑰,所以傳輸過程中無法被中間人截獲。只有擁有私鑰的接收人才能閱讀。此用法通常用於交換對稱金鑰

  • 身份驗證和防止篡改:許可權狗用自己的私鑰加密一段授權明文,並將授權明文和加密後的密文,以及公鑰一併傳送出來,接收方只需要通過公鑰將密文解密後與授權明文對比是否一致,就可以判斷明文在中途是否被篡改過。此方法用於數字簽名

著名的RSA演算法就是非對稱加密演算法,RSA以三個發明人的首字母命名。

非對稱加密演算法如此強大可靠,卻有一個弊端,就是加解密比較耗時。因此,在實際使用中,往往與對稱加密和摘要演算法結合使用。對稱加密很好理解,此處略過1w字。我們再來看一下摘要演算法。

摘要演算法

另一個神奇的演算法就是摘要演算法。摘要演算法是指,可以將任意長度的文字,通過一個演算法,得到一個固定長度的文字。這裡文字不一定只是文字,可以是位元組資料。所以摘要演算法試圖將世間萬物,變成一個固定長度的東西。摘要演算法具有以下重要特性:

  • 只要源文字不同,計算得到的結果,必然不同

  • 無法從結果反推出源(那是當然的,不然就能量不守恆了)

典型的摘要演算法,比如大名鼎鼎的MD5SHA。摘要演算法主要用於比對資訊源是否一致,因為只要源發生變化,得到的摘要必然不同;而且通常結果要比源短很多,所以稱為“摘要”。

數字簽名

理解了非對稱加密和摘要演算法,來看一下數字簽名。實際上數字簽名就是兩者結合。假設,我們有一段授權文字,需要釋出,為了防止中途篡改文字內容,保證文字的完整性,以及文字是由指定的許可權狗發的。首先,先將文字內容通過摘要演算法,得到摘要,再用許可權狗的私鑰對摘要進行加密得到密文,將源文字、密文、和私鑰對應的公鑰一併釋出即可。那麼如何驗證呢?

驗證方首先檢視公鑰是否是許可權狗的,然後用公鑰對密文進行解密得到摘要,將文字用同樣的摘要演算法得到摘要,兩個摘要進行比對,如果相等那麼一切正常。這個過程只要有一步出問題就視為無效。

數字簽名可以快速驗證文字的完整性和合法性,已廣泛應用於各個領域。理解了數字簽名以後,我們進一步來看什麼是數字證書。

數字證書

現實生活的證書

證書顧名思義,就是許可權機構的頒發的證明。比如英語6級證書,就是教育部門頒發給通過了6級考核的個人的證明,證明這個人的英語能力。我們來看一下這個證書的組成:

  • 被證明人:老王

  • 內容:通過了英語六級

  • 蓋章:教育部門的公章或鋼印

於是老王就可以用這張證書找工作了,用人單位會通過檢視證書的各項內容(尤其是公章),來驗證證書的合法性和老王的能力。

在現實生活中,經常有假的6級證書,這些假證書最重要的就是有一個假公章。現實生活中使用法律法規來約束私刻假公章的行為,但是用人單位可能不能十分準確的判斷公章是真是假。而這些問題在數字簽名面前都可以用數學的方法嚴謹的解決。

數字證書:用數字簽名實現的證書

實際上,數字證書就是通過數字簽名實現的數字化的證書。在一般的證書組成部分中,還加入了其他的資訊,比如證書有效期(好比駕駛證初次申領後6年有效),過了有效期,需要重新簽發(駕駛證6年有效後需重新申領)。

跟現實生活中的簽發機構一樣,數字證書的簽發機構也有若干,並有不同的用處。比如蘋果公司就可以簽發跟蘋果公司有關的證書,而跟web訪問有關的證書則是又幾家公認的機構進行簽發。這些簽發機構稱為CA(Certificate Authority)。

對於被簽發人,通常都是企業或開發者。比如需要搭建基於SSL的網站,那麼需要從幾家國際公認的CA去申請證書;再比如需要開發iOS的應用程式,需要從蘋果公司獲得相關的證書。這些申請通常是企業或者開發者個人提交給CA的。當然申請所需要的材料、資質和費用都各不相同,是由這些CA制定的,比如蘋果要求$99或者$299的費用。

之所以要申請證書,當然是為了被驗證。英語6級證書的驗證方一般是用人單位;web應用相關的SSL證書的驗證方通常是瀏覽器;iOS各種證書的驗證方是iOS裝置。我們之所以必須從CA處申請證書,就是因為CA已經將整個驗證過程規定好了。對於iOS,iOS系統已經將這個驗證過程固化在系統中了,除非越獄,否則無法繞過。

證書的授權鏈

數字證書可能還包括證書鏈資訊。舉個例子:如果你要申請休假1周,需要你的上司審批,你的上司需要他的上司同意,最終需要大老闆同意,那麼這一層層的授權,形成了一個授權鏈,大老闆是授權鏈的根(root),中間這些環節分別是被更接近root的人授權的。

我們從蘋果MC(Member Center)中獲得的證書實際也是一個包含有證書鏈的證書,其中的根是蘋果的CA。我們獲得的證書實際上是在告訴iOS裝置:我們的證書是被蘋果CA簽過名的合法的證書。而iOS裝置在執行app前,首先要先驗證CA的簽名是否合法,然後再通過證書中我們的公鑰驗證程式是否的確是我們釋出的,且中途沒有對程式進行過篡改。

iOS證書申請和簽名打包流程圖

在繼續下去之前,先來看一張圖。

這張圖闡述了,開發iOS應用程式時,從申請證書,到打包的大致過程。接下來我將對圖中的每一個環節進行分析。

證書申請

開發iOS程式,必然要進行的工作就是成為開發者,並申請相關的證書,否則你的程式只能在模擬器上執行,無法在真機上除錯,更不要說上架了。那麼在申請證書之前需要:

  1. 支付$99或$299成為蘋果開發者,並每年續費。這一步是蘋果的強制規定,相當於霸王條款,沒錢玩尼瑪!大家都知道$99針對個人和小企業,$299針對大企業,這麼分沒錯,不過你需要知道的是,兩種金額的本質區別在於你可以獲得的證書型別不同,$99當然比$299的少一些。

  2. 安裝蘋果開發者根證書,此證書實際上是我們從蘋果MC中申請的所有證書的“根證書”,安裝這個證書意味著我們的開發工具對此CA的信任,從而可以用此CA簽發的其他證書進行簽名和打包。一般而言,如果安裝了Xcode,那麼這個證書是自動安裝在Key Chain中了。證書如下圖

然後,我們就開始按照很多圖文並茂的教程開始申請證書,各種操作。這裡由於是講原理,不展開這部分。我們來看每一步到底意味著什麼。

什麼是CertificateSigningRequest.certSigningRequest

我們需要生成一個CertificateSigningRequest.certSigningRequest檔案來提交到MC中,從而獲取某種證書。那麼這個檔案到底是什麼呢?從上面的流程圖中大家可以看到,這個檔案包含兩部分內容(Certificate signing request)

  1. 申請者資訊,此資訊是用申請者的私鑰加密的

  2. 申請者公鑰,此資訊是申請者使用的私鑰對應的公鑰

  3. 摘要演算法和公鑰加密演算法

我們可以用openssl來解析檔案中的內容一窺究竟:

openssl asn1parse -i -in CertificateSigningRequest.certSigningRequest

    0:d=0  hl=4 l= 649 cons: SEQUENCE          
    4:d=1  hl=4 l= 369 cons:  SEQUENCE          
    8:d=2  hl=2 l=   1 prim:   INTEGER           :00
   11:d=2  hl=2 l=  68 cons:   SEQUENCE          
   13:d=3  hl=2 l=  36 cons:    SET               
   15:d=4  hl=2 l=  34 cons:     SEQUENCE          
   17:d=5  hl=2 l=   9 prim:      OBJECT            :emailAddress
   28:d=5  hl=2 l=  21 prim:      IA5STRING         :zhoupingtkbjb@163.com
   51:d=3  hl=2 l=  15 cons:    SET               
   53:d=4  hl=2 l=  13 cons:     SEQUENCE          
   55:d=5  hl=2 l=   3 prim:      OBJECT            :commonName
   60:d=5  hl=2 l=   6 prim:      UTF8STRING        :Parker
   68:d=3  hl=2 l=  11 cons:    SET               
   70:d=4  hl=2 l=   9 cons:     SEQUENCE          
   72:d=5  hl=2 l=   3 prim:      OBJECT            :countryName
   77:d=5  hl=2 l=   2 prim:      PRINTABLESTRING   :CN
   81:d=2  hl=4 l= 290 cons:   SEQUENCE          
   85:d=3  hl=2 l=  13 cons:    SEQUENCE          
   87:d=4  hl=2 l=   9 prim:     OBJECT            :rsaEncryption
   98:d=4  hl=2 l=   0 prim:     NULL              
  100:d=3  hl=4 l= 271 prim:    BIT STRING        
  375:d=2  hl=2 l=   0 cons:   cont [ 0 ]        
  377:d=1  hl=2 l=  13 cons:  SEQUENCE          
  379:d=2  hl=2 l=   9 prim:   OBJECT            :sha1WithRSAEncryption
  390:d=2  hl=2 l=   0 prim:   NULL              
  392:d=1  hl=4 l= 257 prim:  BIT STRING        

可以看到檔案包含了我的資訊,並標明使用了sha1摘要演算法和RSA公鑰加密演算法。蘋果的MC在拿到這個後,將這個資訊記錄下來,並簽發出相關的證書。這裡,蘋果實際無需驗證我的資訊,因為如果我不交錢就沒辦法上傳這個檔案,也就得不到證書。

從MC中申請到的證書究竟是什麼

蘋果取出CertificateSigningRequest.certSigningRequest中的公鑰,根本不管我的其他資訊,然後將我的MC賬號資訊和我提交的公鑰封裝在證書中,並進行數字簽名。以開發證書為例,我們用openssl來看一下證書的內容:

openssl x509 -inform der -in ios_development.cer -noout -text

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            65:97:cd:73:6f:19:37:c2
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=US, O=Apple Inc., OU=Apple Worldwide Developer Relations, CN=Apple Worldwide Developer Relations Certification Authority
        Validity
            Not Before: Jul 29 07:36:28 2015 GMT
            Not After : Jul 28 07:36:28 2016 GMT
        Subject: UID=8VPWB57FDW, CN=iPhone Developer: Liang Ding (2U967A2YJ6), OU=7XPNRZE9TC, O=Liang Ding, C=US
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (2048 bit)
                Modulus (2048 bit):
                    00:ab:43:a4:57:32:57:30:81:89:eb:b4:5c:b6:88:
                    7f:4f:59:3a:9e:f6:14:50:2c:5c:14:6d:01:58:bd:
                    d7:2b:a6:66:71:f7:d9:da:58:a2:e8:4c:d5:a9:87:
                    20:5b:b7:4c:58:29:3c:b3:48:de:7f:ad:3f:98:cc:
                    9d:b3:07:2f:93:4a:3a:e5:32:e2:fc:59:30:1e:ee:
                    65:11:c3:88:ea:7a:54:d8:60:56:d1:fa:69:06:40:
                    dd:72:1d:7f:d9:14:85:bf:7a:b0:a3:34:a0:ac:c1:
                    dc:a9:48:3c:9c:43:c8:e4:fd:02:eb:fe:d2:a7:ce:
                    2e:e4:9a:51:20:0b:5b:e5:5a:d4:04:9e:a4:52:8d:
                    c2:1e:1f:50:80:fb:ea:c1:e4:bb:b4:ec:35:fd:96:
                    6a:86:0a:62:fa:d2:5a:8b:34:1b:f2:c5:c8:c9:2c:
                    85:d1:4d:8c:cb:91:be:db:92:f0:88:37:7a:6d:8d:
                    ef:c6:e1:47:5c:e5:ca:e2:5a:47:14:5d:2f:5b:2e:
                    d4:df:61:d9:99:e2:3e:6b:24:b2:aa:36:b3:af:e6:
                    a8:a8:28:a7:8a:73:aa:68:a9:71:ac:81:a8:20:98:
                    bb:3e:76:e2:09:19:41:45:d7:9a:68:1b:7c:1d:f5:
                    b2:0b:36:ac:f0:4b:fc:0a:f1:3c:de:96:a0:10:14:
                    aa:79
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            Authority Information Access: 
                OCSP - URI:http://ocsp.apple.com/ocsp03-wwdr01

            X509v3 Subject Key Identifier: 
                C7:AB:35:54:A3:7B:96:2A:67:55:B8:2F:B6:82:4B:B8:F0:49:0F:EB
            X509v3 Basic Constraints: critical
                CA:FALSE
            X509v3 Authority Key Identifier: 
                keyid:88:27:17:09:A9:B6:18:60:8B:EC:EB:BA:F6:47:59:C5:52:54:A3:B7

            X509v3 Certificate Policies: 
                Policy: 1.2.840.113635.100.5.1
                  User Notice:
                    Explicit Text: Reliance on this certificate by any party assumes acceptance of the then applicable standard terms and conditions of use, certificate policy and certification practice statements.
                  CPS: http://www.apple.com/certificateauthority/

            X509v3 Key Usage: critical
                Digital Signature
            X509v3 Extended Key Usage: critical
                Code Signing
            1.2.840.113635.100.6.1.2: critical
                ..
    Signature Algorithm: sha256WithRSAEncryption
        80:99:47:27:ae:e5:1e:89:1e:c2:ec:52:d7:c8:8b:df:86:25:
        a9:cb:b2:f2:01:6c:5e:a0:55:6c:ad:1d:bd:3b:1c:ce:b4:53:
        4d:03:d0:98:f6:f7:0e:24:2b:c5:cb:5e:

相關推薦

漫談iOS程式證書簽名機制

接觸iOS開發半年,曾經也被這個主題坑的摸不著頭腦,也在淘寶上買過企業證書籤名這些服務,有大神都做了一個全自動的釋出打包(不過此大神現在不賣企業證書了),甚是羨慕和崇拜。於是,花了一點時間去研究了一下iOS這套證書和簽名機制,並撰文分享給需要的朋友。由於本人才疏學淺,多有遺漏或錯誤之處,還請大神多多指

iOS開發者證書描述文件申請

保存 content iphone 2個 gem 密碼 ica nsh 推送 iOS開發者證書是用於開發調試的,可以直接連接你的xcode進行灌裝到你的設備進行測試,第一步需要添加你的設備id然後再申請iOS開發證書。 現在xcode也可以免證書進行調試了。 一、添加

iOS-事件傳遞響應機制

系統 || 聯系 轉換 face dds average 問題 特殊 轉自:http://www.jianshu.com/p/2e074db792ba 前言: 按照時間順序,事件的生命周期是這樣的:  事件的產生和傳遞(事件如何從父控件傳遞到子控件並尋找到最合適的view

iOS開發HTTPS實現之信任SSL證書簽名證書

                                          &nb

iOS發布證書描述文件申請

需要 如果 蘋果 idt onload 證書 afa store 下載 iOS發布證書 用於發布到App Store,只有用iOS發布證書打包的IPA才能上架到蘋果應用市場。 如果要真機調試請看發布iOS調試證書的創建教程。 iOS真機調試介紹 一、創建iOS發布證書 i

基於密鑰庫數字證書的加密解密簽名驗證操作

return 產生 初始 www. 數字證書 ray get put 庫文件 package com.szzs; import java.io.FileInputStream; import java.security.KeyStore; import java.sec

RSA加密解密簽名驗證機制以及其區別聯絡

https://blog.csdn.net/wangjianno2/article/details/68965299   1.RSA的加密解密機制原理RSA公鑰加密體制包含如下3個演算法:KeyGen(金鑰生成演算法),Encrypt(加密演算法)以及Decrypt(解密演算法)。詳細如下:

iOS開發:第一個iOS程式分析——AppDelegate.h檔案檢視View、檢視控制器ViewController

在上一篇文章iOS開發:第一個iOS程式分析——代理,生命週期函式中主要介紹了iOS使用Objective-C開發的兩個主要檔案main.m和AppDelegate.m和控制程式生命週期的函式,接下來將介紹另外兩個檔案:AppDelegate.h檔案、UIViewController.m檔案和i

通俗理解數字簽名,數字證書https

前言 最近在開發關於PDF合同文件電子簽章的功能,大概意思就是在一份PDF合同上簽名,蓋章,使其具有法律效應。簽章有法律效應必須滿足兩個條件: 能夠證明簽名,蓋章者是誰,無法抵賴 PDF合同在簽章後不能被更改 在紙質合同中,由於簽名字跡的不可複製性,蓋章的唯一性以及紙質合

Windows程式訊息機制(三):訊息與程序間通訊

自定義訊息與程序間通訊 視窗程式可以接收自定義的訊息型別,前提是通訊的程序聲明瞭這種訊息型別,宣告的方法很簡單,WM_USER加一個值就可以了,一般加的值從0x400開始,其他的值已經被系統使用了。 實現一個完整的自定義訊息需要進行以下步驟:

Windows程式訊息機制(二):訊息有關的函式

不同視窗程式可以通過訊息進行互動,主要用到的函式如下: FindWindow 獲取一個視窗的控制代碼。 HWND FindWindow( LPCTSTR lpClassName,// 類名 LPCTSTR lpWindowName//

Java記憶體區域(堆區、虛擬機器棧、本地方法棧、程式計數器方法區)GC機制

目錄 Java垃圾回收概況 Java記憶體區域 Java物件的訪問方式 Java記憶體分配機制 Java GC機制 垃圾收集器 Java垃圾回收概況   Java GC(Garbage Collection,垃圾收集,垃圾回收)機制,是Java與C

Andriod Studio 兩種簽名機制V1V2的區別

Android Studio 2.2以上版本打包apk的時候,我們會發現多了個簽名版本(v1、v2)選擇,如下圖紅色方框所示  問題描述(v1和v2) Android 7.0中引入了APK Signature Scheme v2,v1是jar Signature來

iOS 簽名機制

級別: ★★☆☆☆ 標籤:「iOS」「Apple」「簽名機制」 作者: 憶思夢 審校: QiShare團隊 因為蘋果的安全策略,通過簽名機制保證手機上的每個App都是經過蘋果認證的。 App的安裝方式有四種: 通過App Store安裝。 開發者可以通過Xcode安裝。 Ad-

iOS 證書簽名 解惑詳解

教程截圖:     下面是一篇有澳洲墨爾本的一名全職iOS開發者提供的文章。他在論壇上是一個很摩登的年輕人 – Adam Eberbach。   ·Bundle identifier   ·provisioning profiles   ·App ID   

【2.學習__簽名證書加密證書

實習期學習一些簽名和加密的知識:   ------------------------暫時先這樣,有時間了再整理。學習的方法: 先學習證書檔案內容、結構,再針對問題進行學習   證書相關的知識: 1. 證書的結構大致是什麼樣的? 證書的機構分為三部分:

Windows下用openssl命令製作生成證書簽名

這些天領導讓我把web service 由原來的HTTP協議改用加密並且加上客戶認證,系統原本用的gsoap,沒辦法只好調查了,現在總結了一些有關openssl生產證書的步驟: 1、 新建工作目錄,將openssl安裝路徑下的apps/CA.pl 和 apps/openss

一文弄懂關於證書的一切,ssl協議,android包簽名機制

所有的概念都基於一個非常重要的基礎: rsa 非對稱加密演算法 : 1. 在加解密上,兩個祕鑰是對等的 任何一個可以加密,另一個可以用來解密。 2. 用openssl建立一個祕鑰,然後可用該祕鑰可以生成另一個祕鑰。 但是反過來不可以。所以建立的祕鑰叫私鑰

Windows程式訊息機制(一):視窗程式的建立

Windows視窗程式的實現 上面介紹了Windows下的訊息機制,系統傳送訊息到程式,程式接收到訊息後的處理統稱為視窗過程。 要實現視窗過程當然需要先建立一個視窗程式了。視窗程式的建立很簡單,主要分為以下幾個步驟: 註冊視窗類建立視窗及顯示視窗建立訊

ios 程式釋出成ipa 檔案 通過 web 下載安裝。install App via OTA

轉自: iOS 7.1正式版釋出了,之前使用itms-services://URL方式線上安裝ipa檔案的方法卻失效了,點選的時候報錯為:“無法安裝應用程式,因xxx.com的證書無效”(錯誤介面見下圖),這應該怎麼解決呢? 其實iOS 7.1修改了manife