蘋果證書籤名機制
原文地址: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程式,必然要進行的工作就是成為開發者,並申請相關的證書,否則你的程式只能在模擬器上執行,無法在真機上除錯,更不要說上架了。那麼在申請證書之前需要:
-
支付$99或$299成為蘋果開發者,並每年續費。這一步是蘋果的強制規定,相當於霸王條款,沒錢玩尼瑪!大家都知道$99針對個人和小企業,$299針對大企業,這麼分沒錯,不過你需要知道的是,兩種金額的本質區別在於你可以獲得的證書型別不同,$99當然比$299的少一些。
-
安裝蘋果開發者根證書,此證書實際上是我們從蘋果MC中申請的所有證書的“根證書”,安裝這個證書意味著我們的開發工具對此CA的信任,從而可以用此CA簽發的其他證書進行簽名和打包。一般而言,如果安裝了Xcode,那麼這個證書是自動安裝在Key Chain中了。證書如下圖
然後,我們就開始按照很多圖文並茂的教程開始申請證書,各種操作。這裡由於是講原理,不展開這部分。我們來看每一步到底意味著什麼。
什麼是CertificateSigningRequest.certSigningRequest
我們需要生成一個CertificateSigningRequest.certSigningRequest
檔案來提交到MC中,從而獲取某種證書。那麼這個檔案到底是什麼呢?從上面的流程圖中大家可以看到,這個檔案包含兩部分內容(Certificate
signing request):
-
申請者資訊,此資訊是用申請者的
私鑰
加密的 -
申請者公鑰,此資訊是申請者使用的
私鑰
對應的公鑰 -
摘要演算法和公鑰加密演算法
我們可以用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: