亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS實用教程之Https雙向認證詳解

2020-07-26 02:48:18
字體:
來源:轉載
供稿:網友

前言

年前的時候,關于蘋果要強制https的傳言四起,雖然結果只是一個“謠言”,但是很明顯的這是遲早會到來的,間接上加速了各公司加緊上https的節奏,對于iOS客戶端來說,上https需不需要改變一些東西取決于---------對,就是公司有沒有錢。土豪公司直接買買買,iOS開發者只需要把http改成https完事。然而很不幸,我們在沒錢的公司,選擇了自簽證書。雖然網上很多關于https的適配,然而很多都是已過時的,這里我們主要是講一下https雙向認證。

【證書選擇】自簽

【網絡請求】原生NSURLSession或者AFNetworking3.0以上版本

【認證方式】雙向認證

Https雙向認證過程

先來了解一下雙向認證的大體過程:(圖片來自網絡,如果是某位博主原創的請私信我)


下面我們一步步來實現

1、設置服務端證書

 NSString *certFilePath = [[NSBundle mainBundle] pathForResource:@"server" ofType:@"cer"]; NSData *certData = [NSData dataWithContentsOfFile:certFilePath]; NSSet *certSet = [NSSet setWithObject:certData]; AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate withPinnedCertificates:certSet]; policy.allowInvalidCertificates = YES; policy.validatesDomainName = NO; self.afnetworkingManager.securityPolicy = policy;

2、處理挑戰

原生的NSURLSession是在

- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(nonnull NSURLAuthenticationChallenge *)challenge completionHandler:(nonnull void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler

代理方法里面處理挑戰的,再看看AFNetworking在該代理方法里處理的代碼

 if (self.taskDidReceiveAuthenticationChallenge) {  disposition = self.taskDidReceiveAuthenticationChallenge(session, task, challenge, &credential); } else {  ... }

我們只需要給它傳遞一個處理的block

[self.afnetworkingManager setSessionDidReceiveAuthenticationChallengeBlock:^NSURLSessionAuthChallengeDisposition(NSURLSession*session, NSURLAuthenticationChallenge *challenge, NSURLCredential *__autoreleasing*_credential) {  ...}

根據傳來的challenge生成disposition(應對挑戰的方式)和credential(客戶端生成的挑戰證書)

3、服務端認證

當challenge的認證方法為NSURLAuthenticationMethodServerTrust時,需要客戶端認證服務端證書

//評估服務端安全性if([weakSelf.afnetworkingManager.securityPolicy evaluateServerTrust:challenge.protectionSpace.serverTrust forDomain:challenge.protectionSpace.host]) {    //創建憑據    credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];    if(credential) {     disposition =NSURLSessionAuthChallengeUseCredential;    } else {     disposition =NSURLSessionAuthChallengePerformDefaultHandling;    }   } else {    disposition = NSURLSessionAuthChallengeCancelAuthenticationChallenge;   }

4、客戶端認證

認證完服務端后,需要認證客戶端

由于是雙向認證,這一步是必不可省的

   SecIdentityRef identity = NULL;   SecTrustRef trust = NULL;   NSString *p12 = [[NSBundle mainBundle] pathForResource:@"client"ofType:@"p12"];   NSFileManager *fileManager =[NSFileManager defaultManager];   if(![fileManager fileExistsAtPath:p12])   {    NSLog(@"client.p12:not exist");   }   else   {    NSData *PKCS12Data = [NSData dataWithContentsOfFile:p12];    if ([[weakSelf class]extractIdentity:&identity andTrust:&trust fromPKCS12Data:PKCS12Data])    {     SecCertificateRef certificate = NULL;     SecIdentityCopyCertificate(identity, &certificate);     const void*certs[] = {certificate};     CFArrayRef certArray =CFArrayCreate(kCFAllocatorDefault, certs,1,NULL);     credential =[NSURLCredential credentialWithIdentity:identity certificates:(__bridge NSArray*)certArray persistence:NSURLCredentialPersistencePermanent];     disposition =NSURLSessionAuthChallengeUseCredential;    }   }
+ (BOOL)extractIdentity:(SecIdentityRef*)outIdentity andTrust:(SecTrustRef *)outTrust fromPKCS12Data:(NSData *)inPKCS12Data { OSStatus securityError = errSecSuccess; //client certificate password NSDictionary*optionsDictionary = [NSDictionary dictionaryWithObject:@"your p12 file pwd"                 forKey:(__bridge id)kSecImportExportPassphrase]; CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL); securityError = SecPKCS12Import((__bridge CFDataRef)inPKCS12Data,(__bridge CFDictionaryRef)optionsDictionary,&items); if(securityError == 0) {  CFDictionaryRef myIdentityAndTrust =CFArrayGetValueAtIndex(items,0);  const void*tempIdentity =NULL;  tempIdentity= CFDictionaryGetValue (myIdentityAndTrust,kSecImportItemIdentity);  *outIdentity = (SecIdentityRef)tempIdentity;  const void*tempTrust =NULL;  tempTrust = CFDictionaryGetValue(myIdentityAndTrust,kSecImportItemTrust);  *outTrust = (SecTrustRef)tempTrust; } else {  NSLog(@"Failedwith error code %d",(int)securityError);  return NO; } return YES;}

原生NSURLSession雙向認證

在原生的代理方法里面認證就行,代碼基本和AFNetworking的一致,注意最后需要調用

 completionHandler(NSURLSessionAuthChallengeUseCredential, credential);

來執行回調操作

關于UIWebView的Https雙向認證

網上的資料大體上有幾種解決方法

1:跳過Https認證(這還能跳過?沒試過,不太靠譜)

2:中斷原有的請求步驟,將request拿出來,下載完整的HTML代碼,讓webView加載該代碼(在單頁面展示的情況下基本滿足使用,但是在部分標簽不是獨立跳轉https路徑的時候,將出現無法加載的情況,不是很好用)

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { NSString * urlString = [request.URL absoluteString]; if ([urlString containsString:URL_API_BASE]) {  [[SUHTTPOperationManager manager]REQUEST:request progress:nil handler:^(BOOL isSucc, id responseObject, NSError *error) {   NSString * htmlString = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];   BASE_INFO_FUN(@"下載HTML完畢");   [self loadHTMLString:htmlString baseURL:nil];  }];  return NO; } return YES;}

3、中斷原有的請求步驟,將request拿出來,完成鑒權認證之后,再讓webView重新請求該request(這種方式理論上好像可以,我試過,沒有成功,可能我打開的方式不正確)
4、或許,您有更好的解決方案 - -

關于代碼

網上很多https雙向認證的代碼,基本是一樣的,這里我們直接拿來用就可以,前提是我們不能單純copy,而是在理解其實現的基礎上,整合到工程中,遇到問題解決思路清晰,而不是一臉懵逼。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美另类在线观看| 欧美激情精品久久久久久蜜臀| 国产玖玖精品视频| 岛国av一区二区在线在线观看| 亚洲香蕉成人av网站在线观看| 黑人与娇小精品av专区| 热99精品只有里视频精品| 亚洲天堂av综合网| 亚洲剧情一区二区| 国产午夜精品全部视频播放| 久久久欧美一区二区| 亚洲第一福利网站| 国产原创欧美精品| 奇米4444一区二区三区| 欧美精品免费播放| 亚洲精品视频在线播放| 日韩性生活视频| 国产精品久久91| 国产视频精品久久久| 中文字幕国内精品| 国产精品99久久久久久www| 成人写真视频福利网| 97久久精品在线| 欧美日韩国产丝袜美女| 最好看的2019的中文字幕视频| 欧美孕妇孕交黑巨大网站| 色老头一区二区三区在线观看| 国产成人精品一区二区| 国产欧美一区二区三区四区| 亚洲电影免费在线观看| 国产精品高潮呻吟久久av无限| 成人美女av在线直播| 狠狠做深爱婷婷久久综合一区| 国产精品成人观看视频国产奇米| 国产婷婷97碰碰久久人人蜜臀| 亚洲成人1234| 欧美激情精品久久久| 国产精品人成电影在线观看| 91po在线观看91精品国产性色| 欧美影院成年免费版| 国产999精品| 夜夜躁日日躁狠狠久久88av| 日韩精品视频在线| 久久久久成人网| 亚洲tv在线观看| 精品国产依人香蕉在线精品| 日韩一区二区在线视频| 亚洲综合成人婷婷小说| 综合激情国产一区| 2019精品视频| 97视频在线观看免费高清完整版在线观看| 亚洲欧美国产日韩中文字幕| 日韩有码在线观看| 日韩成人免费视频| 欧美国产日韩在线| 国产精品狠色婷| 欧美做受高潮1| 欧美亚洲国产视频| 国产婷婷97碰碰久久人人蜜臀| 福利微拍一区二区| 中文字幕av日韩| 91系列在线观看| 日韩精品一二三四区| 97精品视频在线播放| 精品视频在线播放免| 91免费精品国偷自产在线| 久久亚洲精品一区| 国产自产女人91一区在线观看| 97欧美精品一区二区三区| 久久久久久久999精品视频| 欧美色道久久88综合亚洲精品| 中文字幕亚洲欧美| 久久久国产一区| 色偷偷偷亚洲综合网另类| 国产精品香蕉在线观看| 国产69精品99久久久久久宅男| 亚洲欧美日韩高清| 国外成人在线播放| 国产裸体写真av一区二区| 伊是香蕉大人久久| 久久99青青精品免费观看| 日韩精品视频三区| 国产精品私拍pans大尺度在线| 亚洲另类欧美自拍| 国产在线精品成人一区二区三区| 国产精品一区二区三区免费视频| 欧美插天视频在线播放| 亚洲精品小视频在线观看| 国产成人精品一区| 欧美日韩亚洲精品一区二区三区| 51ⅴ精品国产91久久久久久| 欧美xxxx14xxxxx性爽| 欧美午夜电影在线| 国产亚洲人成a一在线v站| 欧美日韩一区二区三区| 国产精品96久久久久久| 国产激情综合五月久久| 国产脚交av在线一区二区| 久久精品电影网站| 日韩美女主播视频| 日韩中文有码在线视频| 色婷婷av一区二区三区久久| 国产精品中文字幕在线观看| 91在线免费看网站| 欧美巨乳在线观看| 色综合91久久精品中文字幕| 欧美极品少妇xxxxⅹ免费视频| 国内精品伊人久久| 在线免费观看羞羞视频一区二区| 欧美精品xxx| 国产日韩欧美综合| 欧美成人小视频| 日韩一区二区精品视频| 国产在线拍揄自揄视频不卡99| 亚洲精品久久久久中文字幕欢迎你| 国产大片精品免费永久看nba| 欧美黄色小视频| 欧美一区二区三区……| 国产精品欧美风情| 亚洲精品中文字幕有码专区| 久久久久久久av| 成人网中文字幕| 亚洲国产精彩中文乱码av| 国产精品久久久av久久久| 欧美性猛交99久久久久99按摩| 国产精品草莓在线免费观看| 7777kkkk成人观看| 国产精品久久77777| 欧美激情二区三区| 亚洲精品动漫100p| 成人精品久久av网站| 亚洲成av人影院在线观看| 亚洲欧洲日产国码av系列天堂| 亚洲欧美国产精品专区久久| 尤物yw午夜国产精品视频| 亚洲精品少妇网址| 日韩久久免费电影| 日韩美女视频在线观看| 中文字幕亚洲欧美日韩2019| 日本午夜在线亚洲.国产| 国产91色在线免费| 欧美疯狂做受xxxx高潮| 亚洲天堂av在线免费观看| 亚洲欧美在线第一页| 欧美亚洲国产成人精品| 久久久久久久久综合| 亚洲一区二区三区在线免费观看| 97视频网站入口| 日本精品性网站在线观看| 国产精品成人品| 精品免费在线观看| 欧美午夜精品伦理| 欧美黄色性视频| 久久九九免费视频| 欧美日韩亚洲一区二| 日产日韩在线亚洲欧美| 欧美www视频在线观看| 亚洲欧洲国产一区| 91久久久久久久久久久| 久久久久久尹人网香蕉| 亚洲黄在线观看| 亚洲国产精彩中文乱码av| 久久成人精品一区二区三区| 51午夜精品视频|