IOS证书学习总结
IOS證書的申請和使用
http://www.cnblogs.com/cy568searchx/p/4895406.html蘋果的證書繁鎖復雜,制作管理相當麻煩,今天決定重置一個游戲項目中的所有證書,做了這么多次還
是感覺很糾結,索性直接記錄下來,日后你我他查閱都方便;
關于證書
蘋果使用密文簽名技術來驗證App的合法性,不管是iOS應用還是Mac應用都需要相應的簽名證書來作為測
試或發布App用。這里主要談談iOS的證書,當然,Mac的證書也基本類似。
在開發iOS應用的時候,我們需要簽名證書(開發證書)來驗證,并允許我們在真機上對App進行測試。
另外,在發布App到App store的時候,我們也需要證書(發布證書)來做驗證。那么什么是簽名證書,如
何獲取簽名證書,下面聽我慢慢道來。
首先,證書(Certificate)是用來證明某一件事是否成立的,好比拿到的獲獎證書,是證明參加比賽并
獲獎的憑證。類似,在iOS開發中,用證書來證明你是否具有某些權限或者能力來做某事。代碼簽名驗證
允許我們的操作系統來判斷是誰對App進行了簽名,在安裝了Xcode后,Xcode會在項目編譯期間使用你的
代碼簽名驗證,這個驗證由一個由Apple認證過的公鑰-私鑰對組成,私鑰存儲在你的鑰匙串中(Mac本地
,在系統實用工具中),公鑰包含在證書(Certificates)中,證書在本地鑰匙串和開發者賬號中都有
存儲,這種公鑰-私鑰驗證授權的方式在很多地方都有使用到,比如Git中的SSH協議也是通過這種方式來
確認訪問權限。另外,還有一個我們可以叫做媒介證書的證書來確保我們的證書(Certificates)是經
過授權而發布的。如下圖所示:
1
當安裝好Xcode時,媒介證書(Intermediate Certificate)就已經安裝到我們的鑰匙串中去了。通過在
開發者賬號(Developer Account)和本地(Mac)都經過驗證的證書(Certificate)我們就可以利用合
法的證書進行App的測試和發布了。
首先得描述一下各個證書的定位,作用,這樣在制作的時候心中有譜,對整個流程的把握也會準確一些
;
1、開發者證書(分為開發和發布兩種,類型為ios Development,ios Distribution),這個是最基礎的
,不論是真機調試,還是上傳到appstore都是需要的,是一個基證書,用來證明自己開發者身份的;
2、appID,這是每一個應用的獨立標識,在設置項中可以配置該應用的權限,比如是否用到了
PassBook,GameCenter,以及更常見的push服務,如果選中了push服務,那么就可以創建生成下面第3條所
提到的推送證書,所以,在所有和推送相關的配置中,首先要做的就是先開通支持推送服務的appID;
3、推送證書(分為開發和發布兩種,類型分別為APNs Development ios,APNs Distribution ios),該
證書在appID配置中創建生成,和開發者證書一樣,安裝到開發電腦上;
4、Provisioning Profiles,這個東西是很有蘋果特色的一個東西,我一般稱之為PP文件,該文件將
appID,開發者證書,硬件Device綁定到一塊兒,在開發者中心配置好后可以添加到Xcode上,也可以直接
在Xcode上連接開發者中心生成,真機調試時需要在PP文件中添加真機的udid;是真機調試和必架必備之
珍品;
平常我們的制作流程一般都是按以上序列進行,先利用開發者帳號登陸開發者中心,創建開發者證書,
appID,在appID中開通推送服務,在開通推送服務的選項下面創建推送證書(服務器端的推送證書見下文
),之后在PP文件中綁定所有的證書id,添加調試真機等;
具體操作流程如下:
1、開發者證書的制作,首先登陸到開發者中心,找到證書配置的版塊,猛戳進入,點進證書,會顯示如
下界面,點擊右上角的加號:
會出現以下界面,該操作重復兩次,分別創建開發測試證書和發布證書,開發測試證書用于真機調試,
發布證書用于提交到appStore,我們以開發測試證書為例,選擇第一個紅框中的內容:
然后下一步,會提示創建CSR文件,也就是證書簽名請求文件,會有很詳細的操作說明,如果英文不太好
,可以參考下圖;
根據它的說明創建打開KeychainAccess 創建 Certificate Signing Request。
填寫“User Email Address”和“Common Name” 后選擇 Saved to disk 進行保存 。
之后將該CSR文件保存到一處;
繼續返回Apple developer 網站點擊 Continue ,上傳剛剛生成的 .certSigningRequest (CSR)文件生
成 APNs Push ?Certificate(CER):
提交上去后就會生成一個cer證書,如圖所示,有效期為一年;
下載并雙擊打開證書,證書打開時會啟動“鑰匙串訪問”工具。
在“鑰匙串訪問”中你的證書會顯示在“我的證書”中,注意選擇“My Certificates” 和"login"
備注:CSR文件盡量每個證書都制作一次,將常用名稱區分開來,因為該常用名稱是證書中的密鑰的名字
;
之后在開發者中心將該CSR文件提交;
如果開發者B,登錄開發者賬號,下載證書(cer文件)運行,只有證書沒有秘鑰,是不能正常使用的
blob.png
所以如果有新同事加入到開發組的時候,應該從本地鑰匙串中選擇證書,導出p12文件(包含證書和秘鑰
)給同事。
另外可以給同事一份Provisioning Profiles文件(配置文件),用于本地開發識別測試設備
導出p12文件:鑰匙串——選擇證書——右鍵導出——存儲為——設置p12文件密碼
(發給同事后,雙擊p12文件,輸入密碼,本地安裝證書成功)
需要強調一點,證書和項目關系其實并不大,證書一般有效期只有一年,當證書過期后,只需要重新生
成一份證書,上傳到開發者賬號就行,同時因為原有證書過期,需要重新生成Provisioning Profiles文
件。然后給同事們最新的p12文件和Provisioning Profiles文件就行
所以開發者賬號中的證書,配置文件是可以放心操作的(比如誤刪了,或者找不到證書秘鑰了)
========
團隊開發中如何共用證書
http://www.cnblogs.com/cy568searchx/p/4895398.html? ?團隊開發中,需要共享證書文件和私鑰。若僅從provisioning portal下載證書文件而無私鑰,xcode
會提示出錯:Unable to code design using identities in this team: no private keys available
(無法在團隊中進行代碼簽名:找不到有效的私鑰)。解決辦法:
(1) 打開鑰匙串程序,選擇 ‘秘鑰’ 種類。
(2) 右鍵點擊(或按住control點擊)與開發證書相配套的私鑰(專用密鑰),并點擊 ‘導出’,保存
為Personal Information Exchange (.p12) 文件格式.,將提示你創建一個密碼,并需要管理員密碼才
可導出。
(3) 拷貝該p12文件到其他機子上,會提示你輸入上一步輸入的密碼。
要讓真機跑起來,必須要在code signing里選者正確的provision(.mobileprovision)。provision是通
過certificate(證書)生成的,并包括了可以調試的設備uuid和對應的appid,只有滿足這些條件的設備
和app才能使用這個provision跑起來。xcode一般會自動提供一個team provision用于讓所有在開發者帳
號這冊過的設備在所有的app上能運行,這樣你就不用專門去制作用于調試的provision了。不過也有例
外的情況,如果你的app要使用push notification,in-app purchase等這些功能,還是需要使用只對應
該appid的provision。provision分為調試和發布兩種,分別由調試證書和發布證書生成,使用發布的
provision不能在設備上作調試,使用調試的provision生成的app不能提交到AppStore上。
? ? ? ?證書(.cer)是通過CSR(.certSigningRequest)文件生成的,CSR文件通過keychain工具來制作,
生成之后會在keychain里保存私鑰,蘋果通過CSR生成的證書文件則包含公鑰信息。這個私鑰相當的重要
,往往真機調試不了出現code signing invalid就是因為缺少私鑰文件。私鑰導出的是p12格式文件。
? ? ? 公鑰和私鑰是如何保證數據安全的,網上有好多資料介紹,簡單來說它們是非對稱加密方式,用
私鑰加密的數據要用公鑰才能解密,用公鑰加密的數據要用私鑰才能解密。數字證書相當于網絡識別本
人的身份證,它包含有公鑰的信息所以是公開被別人下載的,而私鑰則是本人持有的。本人通過私鑰把
數據加密發送出去后,持有本人數字證書的機構或個人如果能解密成功,就證明該數據確實是本人發送
的,這樣數字證書就能起到識別發送者身份的作用。
========
ios開發使用Basic Auth 認證方式
http://blog.csdn.net/joonchen111/article/details/48447813? ? ? ? ?我們app的開發通常有2種認證方式 ? 一種是Basic Auth,一種是OAuth;現在普遍還是使用
OAuth的多,而使用Basic Auth認證的少,正好呢我今天給大家介紹的就是使用的比較少的Badic Auth認
證方式,這種認證方式開發和調試簡單, 沒有復雜的頁面跳轉邏輯和交互過程,更利于發起方控制。然
而缺點就是安全性更低,不過也沒事,我們可以使用https安全加密協議,這樣才更安全。
? ? ? ? 我使用的是AFNetworking發送的網絡請求,因此我們用Basic Auth認證方式就不能再使用AFN的
默認的GET或者POST請求,而是自己定義的NSMutableRequest請求,使用AFN發送,如下面代碼:
//http的get請求地址 ?
? ?NSString *urlStr=[NSString stringWithFormat:@"https://192.168.1.157:8443/v1/sms/send/
%@",self.username.text]; ?
? ?NSURL *url = [NSURL URLWithString:urlStr]; ?
? ?//自定義的request ?
? ?NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; ?
? ?//請求過期時間 ?
? ?request.timeoutInterval = 10; ?
? ?//get請求 ?
? ?request.HTTPMethod = @"GET"; ?
? ?//配置用戶名 密碼 ?
? ?NSString * str = [NSString stringWithFormat:@"%@:%@",@"lairen.com",@"sdclean.com"]; ?
? ?//進行加密 ?[str base64EncodedString]使用開源Base64.h分類文件加密 ?
? ?NSString * str2 = [NSString stringWithFormat:@"Basic %@",[str base64EncodedString]]; ?
? ?[request setValue:str2 forHTTPHeaderField:@"Authorization"]; ?
? ?AFHTTPRequestOperation *op=[[AFHTTPRequestOperation alloc]initWithRequest:request]; ?
? ?//設置返回數據為json數據 ?
? ?op.responseSerializer= [AFJSONResponseSerializer serializer]; ?
? ?//發送網絡請求 ?
? ?[op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id?
responseObject) { ?
? ? ? ? ?
? ? ? ?NSLog(@"%@",responseObject); ?
? ?} failure:^(AFHTTPRequestOperation *operation, NSError *error) { ?
? ? ? ? NSLog(@"%@",error); ?
? ?}]; ?
? ?//請求完畢回到主線程 ?
? ?[[NSOperationQueue mainQueue] addOperation:op]; ?
? ? ?使用Basic Auth認證方式,AFN發送網絡請求就是上述代碼的格式,其中代碼的一些難懂的點,我
在下圖做了注釋;
? ? ? 我注釋的第一個是用戶名,第二個是密碼,這個使我們Basic Auth認證方式必須設置的請求頭,
然后第三個呢是我們為了我確保安全把用戶名和密碼的字符串進行了Base64加密,使用的2個文件是開源
的Base64.h ?Base64.m 。github上面就可以下載。
? 上述代碼中的這行是對字符串進行的加密,記住是使用的Base64.h分類方法進行的加密,一定要先導
入Base64.h文件才可以這樣加密。
[str base64EncodedString] ?
NSString * str2 = [NSString stringWithFormat:@"Basic %@",[str base64EncodedString]]; ?
? 到這里我們的Basic Auth認證方式就講完了,怎么樣,很簡單吧。
========
iOS 8使用Touch ID進行身份認證
http://blog.csdn.net/lgouc/article/details/39829409? ?iOS 8的SDK開放了Touch ID的接口.從WWDC的視頻中可以看到Touch ID應用在兩個方面:用于Key?
Chain加密和用于授權.iOS 8正式版發布以后我們可以看到Evernote的iOS app已經集成了該功能.下面來
看看如何實現使用Touch ID進行身份認證.
? 其實很簡單,用于身份認證的所有的接口都在LocalAuthentication framework中, 該framework實際上
只有三個頭文件:
? LAContext.h
? LAError.h
? LAPublicDefines.h
? 而實際用到的函數也只有兩個:
? // 用來判斷設備是否支持Touch ID
? - (BOOL)canEvaluatePolicy:(LAPolicy)policy error:(NSError * __autoreleasing *)error;
? // 真正驗證身份的函數
? - (void)evaluatePolicy:(LAPolicy)policy
? ? ? ?localizedReason:(NSString *)localizedReason
? ? ? ? ? ? ? ? ?reply:(void(^)(BOOL success, NSError *error))reply;
? 上述兩個函數都是LAContext的member function.目前LAPolicy只有一個值:?
LAPolicyDeviceOwnerAuthenticationWithBiometrics.
? 如果canEvaluatePolicy返回YES,表示設備支持指紋識別,那么便可以調用evaluatePolicy:函數進行指
紋識別了.調用evaluatePolicy函數后會彈出一個alert,如下圖:
? 該alert可定制的只有兩處:
? 1.”To access your photos”提示文字是由localizedReason參數指定的,用來向用戶說明使用Touch?
ID的目的.
? 2.”Enter Password”可由LAContext的localizedFallbackTitle屬性設置(LAContext目前只有這一個
屬性),如果不設置的話,默認是”Enter Password”.值得注意的是,如果該屬性設置為@“”(空字符串),
該按鈕會被隱藏,Evernote應該就是這么做的.
? 其他的免談,當然更別提獲取用戶的指紋數據了.
? 理論上三種情況下會退出驗證(alert會被dismiss,reply回調會被調用):
? 1.用戶指紋通過驗證
? 2.用戶點擊”Enter Password”按鈕
? 3.用戶點擊”Cancel”按鈕
? 還有一種情況:用戶輸入了錯誤的指紋.這種情況下,該alert不會被dismiss,其標題會由”Touch ID”
改為”Try Again”,有彈簧狀的動畫效果過渡.好了,代碼如下(不要忘了引入頭文件?
<LocalAuthentication/LocalAuthentication.h>):
? ? LAContext *context = [LAContext new];
? ?
? ? NSError *error;
? ? context.localizedFallbackTitle = @"";
? ?
? ? if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics?
error:&error]) {
? ? ? ? NSLog(@"Touch ID is available.");
? ? ? ? [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics?
? ? ? ? ? ? ? ? localizedReason:NSLocalizedString(@"Use Touch ID to log in.", nil)?
? ? ? ? ? ? ? ? ? ? ? ? ? reply:^(BOOL success, NSError *error) {
? ? ? ? ? ? if (success) {
? ? ? ? ? ? ? ? NSLog(@"Authenticated using Touch ID.");
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? if (error.code == kLAErrorUserFallback) {
? ? ? ? ? ? ? ? ? ? NSLog(@"User tapped Enter Password");
? ? ? ? ? ? ? ? } else if (error.code == kLAErrorUserCancel) {
? ? ? ? ? ? ? ? ? ? NSLog(@"User tapped Cancel");
? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? NSLog(@"Authenticated failed.");
? ? ? ? ? ? }
? ? ? ? }];
? ? } else {
? ? ? ? NSLog(@"Touch ID is not available: %@", error);
? ? }
? ? 在開發中遇到過一個問題, 不知道是不是bug, 就是啟動程序后立即使用Touch ID, 這樣會導致身份
驗證通過了, 但是上述的alert并不會被dismiss. 詳情參見
https://github.com/RungeZhai/TouchIDIssue
========
總結
- 上一篇: 图解微软ReportBuilder3连接
- 下一篇: 图解修改Windows启动菜单命令行工具