漫談iOS程式的證書和簽名機制
接觸iOS開發半年,曾經也被這個主題坑的摸不著頭腦,也在淘寶上買過企業證書籤名這些服務,有大神都做了一個全自動的釋出打包(不過此大神現在不賣企業證書了),甚是羨慕和崇拜。於是,花了一點時間去研究了一下iOS這套證書和簽名機制,並撰文分享給需要的朋友。由於本人才疏學淺,多有遺漏或錯誤之處,還請大神多多指教。
非對稱加密和摘要
非對稱加密的特性和用法
非對稱加密演算法可能是世界上最重要的演算法,它是當今電子商務等領域的基石。簡而言之,非對稱加密就是指加密金鑰和解密金鑰是不同的,而且加密金鑰和解密金鑰是成對出現。非對稱加密又叫公鑰加密,也就是說成對的金鑰,其中一個是對外公開的,所有人都可以獲得,稱為公鑰,而與之相對應的稱為私鑰,只有這對金鑰的生成者才能擁有。公私鑰具有以下重要特性:
-
對於一個私鑰,有且只有一個與之對應的公鑰。生成者負責生成私鑰和公鑰,並儲存私鑰,公開公鑰
-
公鑰是公開的,但不可能通過公鑰反推出私鑰,或者說極難反推,只能窮舉,所以只要金鑰足夠長度,要通過窮舉而得到私鑰,幾乎是不可能的
-
通過私鑰加密的密文只能通過公鑰解密,公鑰加密的密文只有通過私鑰解密
由於上述特性,非對稱加密具有以下的典型用法:
-
對資訊保密,防止中間人攻擊:將明文通過接收人的公鑰加密,傳輸給接收人,因為只有接收人擁有對應的私鑰,別人不可能擁有或者不可能通過公鑰推算出私鑰,所以傳輸過程中無法被中間人截獲。只有擁有私鑰的接收人才能閱讀。此用法通常用於交換
對稱金鑰
-
身份驗證和防止篡改:許可權狗用自己的私鑰加密一段授權明文,並將授權明文和加密後的密文,以及公鑰一併傳送出來,接收方只需要通過公鑰將密文解密後與授權明文對比是否一致,就可以判斷明文在中途是否被篡改過。此方法用於
數字簽名
。
著名的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:
相關推薦
漫談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發布證書和描述文件申請
需要 如果 蘋果 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 兩種簽名機制V1和V2的區別
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