iOS WKWebView HTTPS 單向火诸、雙向證書驗證 2018-11-21

最近在做一個用AVplayer播放HTTPSURL锦针,一直實現(xiàn)不了,最后用WKWebView實現(xiàn)的置蜀,但是需要證書的各種驗證奈搜,這里把代碼貼出來,以供大家參考盯荤。有什么不足的歡迎大家再補充馋吗。

雙向驗證:

- (void)webView:(WKWebView*)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge*)challenge completionHandler:(void(^)(NSURLSessionAuthChallengeDispositiondisposition,NSURLCredential*_Nullablecredential))completionHandler{ ? ?NSURLSessionAuthChallengeDisposition disposition = NSURLSessionAuthChallengePerformDefaultHandling;

? ? NSURLCredential*credential =nil;

? ? // 服務(wù)器驗證

? ? if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust])

? ? {

//? ? ? ? /* 調(diào)用自定義的驗證過程 */

? ? ? ? if([selfmyCustomValidation:challenge]) {

? ? ? ? ? ? credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];

? ? ? ? ? ? if(credential) {

? ? ? ? ? ? ? ? disposition =NSURLSessionAuthChallengeUseCredential;

? ? ? ? ? ? }

? ? ? ? }else{

? ? ? ? ? ? /* 無效的話,取消 */

? ? ? ? ? ? disposition =NSURLSessionAuthChallengeCancelAuthenticationChallenge;

? ? ? ? }

? ? }else if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodClientCertificate])

? ? {//客戶端認(rèn)證

? ? ? ? NSString *thePath = [[NSBundle mainBundle] pathForResource:@"client" ofType:@"p12"];

? ? ? ? NSData *PKCS12Data = [[NSData alloc] initWithContentsOfFile:thePath];

? ? ? ? CFDataRefinPKCS12Data = (CFDataRef)CFBridgingRetain(PKCS12Data);

? ? ? ? SecIdentityRefidentity;

? ? ? ? // 讀取p12證書中的內(nèi)容

? ? ? ? OSStatusresult = [selfextractP12Data:inPKCS12DatatoIdentity:&identity];

? ? ? ? if(result !=errSecSuccess){

? ? ? ? ? ? completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil);

? ? ? ? ? ? return;

? ? ? ? }

? ? ? ? SecCertificateRefcertificate =NULL;

? ? ? ? SecIdentityCopyCertificate(identity, &certificate);

? ? ? ? constvoid*certs[] = {certificate};

? ? ? ? CFArrayRef certArray = CFArrayCreate(kCFAllocatorDefault, certs, 1, NULL);

? ? ? ? credential = [NSURLCredential credentialWithIdentity:identity certificates:(NSArray*)CFBridgingRelease(certArray) persistence:NSURLCredentialPersistencePermanent];

? ? ? ? if(credential) {

? ? ? ? ? ? disposition =NSURLSessionAuthChallengeUseCredential;

? ? ? ? }

? ? }

? ? if(completionHandler) {

? ? ? ? completionHandler(disposition, credential);

? ? }

}

-(OSStatus) extractP12Data:(CFDataRef)inP12Data toIdentity:(SecIdentityRef*)identity {

? ? OSStatussecurityError =errSecSuccess;

? ? CFStringRefpassword =CFSTR("123456");//證書密碼

? ? const void *keys[] = { kSecImportExportPassphrase };

? ? constvoid*values[] = { password };

? ? CFDictionaryRefoptions =CFDictionaryCreate(NULL, keys, values,1,NULL,NULL);

? ? CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL);

? ? securityError =SecPKCS12Import(inP12Data, options, &items);

? ? if(securityError ==0) {

? ? ? ? CFDictionaryRef ident = CFArrayGetValueAtIndex(items,0);

? ? ? ? constvoid*tempIdentity =NULL;

? ? ? ? tempIdentity =CFDictionaryGetValue(ident, kSecImportItemIdentity);

? ? ? ? *identity = (SecIdentityRef)tempIdentity;

? ? }

? ? if(options) {

? ? ? ? CFRelease(options);

? ? }

? ? returnsecurityError;

}

- (BOOL)myCustomValidation:(NSURLAuthenticationChallenge*)challenge

{

? ? //獲取trust object

? ? SecTrustRef trust = challenge.protectionSpace.serverTrust;

? ? SecTrustResultType result;

? ? //導(dǎo)入證書

? ? NSString * cerPath = [[NSBundle mainBundle] pathForResource:@"serverShuang" ofType:@"der"];; //證書的路徑

? ? NSData * cerData = [NSData dataWithContentsOfFile:cerPath];

? ? SecCertificateRef certificate = SecCertificateCreateWithData(NULL, (__bridge CFDataRef)(cerData));

? ? NSMutableArray*trustedCertificates = [NSMutableArraynew];

? ? [trustedCertificatesaddObject:(__bridge_transferid)(certificate)];

//? ? trustedCertificates = @[CFBridgingRelease(certificate)];

? ? //注意:這里將之前導(dǎo)入的證書設(shè)置成下面驗證的Trust Object的anchor certificate

? ? SecTrustSetAnchorCertificates(trust, (__bridge CFArrayRef)trustedCertificates);

? ? //2)SecTrustEvaluate會查找前面SecTrustSetAnchorCertificates設(shè)置的證書或者系統(tǒng)默認(rèn)提供的證書秋秤,對trust進(jìn)行驗證

? ? OSStatusstatus =SecTrustEvaluate(trust, &result);

? ? if(status ==errSecSuccess&&

? ? ? ? (result ==kSecTrustResultProceed ||

?? ? ? ? result ==kSecTrustResultUnspecified)){//強制過

? ? ? ? ? ? returnYES;

? ? ? ? }

? ? return NO;

}

單向驗證:

- (void)webView:(WKWebView*)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge*)challenge completionHandler:(void(^)(NSURLSessionAuthChallengeDispositiondisposition,NSURLCredential*_Nullablecredential))completionHandler{

//單向證書驗證

//? ? SecTrustRef servertrust = challenge.protectionSpace.serverTrust;

//

//? ? SecCertificateRef certi= SecTrustGetCertificateAtIndex(servertrust, 0);

//

//? ? NSData *certidata = CFBridgingRelease(CFBridgingRetain(CFBridgingRelease(SecCertificateCopyData(certi))));

//

//? ? NSString *path = [[NSBundle mainBundle] pathForResource:@"server" ofType:@"der"];

//

//? ? NSData *localCertiData = [NSData dataWithContentsOfFile:path];

//

//? ? if ([certidata isEqualToData:localCertiData]) {

//

//? ? ? ? NSURLCredential *credential = [[NSURLCredential alloc] initWithTrust:servertrust];

//

//? ? ? ? [challenge.sender useCredential:credential forAuthenticationChallenge:challenge];

//

//? ? ? ? completionHandler(NSURLSessionAuthChallengeUseCredential, credential);

//

//? ? ? ? NSLog(@"服務(wù)端證書認(rèn)證通過");

//

//? ? }else {

//

//? ? ? ? completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil);

//

//? ? ? ? NSLog(@"服務(wù)端認(rèn)證失敗");

//

//? ? }

}

證書全部信任:

- (void)webView:(WKWebView*)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge*)challenge completionHandler:(void(^)(NSURLSessionAuthChallengeDispositiondisposition,NSURLCredential*_Nullablecredential))completionHandler{

?//全部信任

//? ? if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {

//

//? ? ? ? NSURLCredential *credential = [[NSURLCredential alloc]initWithTrust:challenge.protectionSpace.serverTrust];

//

//? ? ? ? completionHandler(NSURLSessionAuthChallengeUseCredential,credential);

//

//? ? }

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末宏粤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子灼卢,更是在濱河造成了極大的恐慌绍哎,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鞋真,死亡現(xiàn)場離奇詭異崇堰,居然都是意外死亡,警方通過查閱死者的電腦和手機涩咖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門赶袄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人抠藕,你說我怎么就攤上這事〗В” “怎么了盾似?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我零院,道長溉跃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任告抄,我火速辦了婚禮撰茎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘打洼。我一直安慰自己龄糊,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布募疮。 她就那樣靜靜地躺著炫惩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪阿浓。 梳的紋絲不亂的頭發(fā)上他嚷,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音粘咖,去河邊找鬼。 笑死唱捣,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的拣宰。 我是一名探鬼主播巡社,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼燕耿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后圆雁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡窖剑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年需了,在試婚紗的時候發(fā)現(xiàn)自己被綠了鹅颊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片历帚。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖室叉,靈堂內(nèi)的尸體忽然破棺而出恼除,到底是詐尸還是另有隱情令野,我是刑警寧澤餐抢,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站苦蒿,受9級特大地震影響殴胧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜佩迟,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一团滥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧报强,春花似錦灸姊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碗誉。三九已至,卻和暖如春父晶,著一層夾襖步出監(jiān)牢的瞬間哮缺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工甲喝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留尝苇,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓埠胖,卻偏偏與公主長得像糠溜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子直撤,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容