1. 程式人生 > >蘋果證書籤名機制

蘋果證書籤名機制

原文地址:http://www.mamicode.com/info-detail-1155997.html

非對稱加密和摘要

非對稱加密的特性和用法

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

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

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

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

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

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

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

著名的RSA演算法就是非對稱加密演算法,RSA

以三個發明人的首字母命名。

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

摘要演算法

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

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

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

典型的摘要演算法,比如大名鼎鼎的MD5

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

數字簽名

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

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

技術分享

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

數字證書

現實生活的證書

證書顧名思義,就是許可權機構的頒發的證明。比如英語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:71:88:bd:53: