[iOS]網(wǎng)絡(luò)請(qǐng)求中的證書驗(yàn)證-NSURLConnection

記錄一下在網(wǎng)絡(luò)請(qǐng)求中證書驗(yàn)證的基于NSURLConnection的實(shí)現(xiàn)

一.開始一個(gè)請(qǐng)求

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    //保存數(shù)據(jù)
    self.data = [NSMutableData data];
    
    NSMutableURLRequest * request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"https://XXXXXXXXXXXX"] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:240];
    [request setHTTPMethod:@"POST"];
    [request setHTTPShouldHandleCookies:YES];
    NSStringEncoding gbkEncoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
    NSData *postData = [@"XX=XX&XX=XX" dataUsingEncoding:gbkEncoding];
    [request setHTTPBody:postData];

    self.connection = [NSURLConnection connectionWithRequest:request delegate:self];
}

二.實(shí)現(xiàn)NSURLConnection驗(yàn)證的回調(diào)方法

- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
    
    if (challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust) {
        SecTrustRef trust = challenge.protectionSpace.serverTrust;
        SecTrustResultType result;
        
        //獲取本地證書
        NSData *data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"XXX" ofType:@"cer"]];
        SecCertificateRef certificate = SecCertificateCreateWithData(NULL, (__bridge CFDataRef)(data));
        
        SecTrustSetAnchorCertificates(trust, (__bridge CFArrayRef)@[CFBridgingRelease(certificate)]);
        OSStatus status = SecTrustEvaluate(trust, &result);
        
        
        if (status == errSecSuccess &&
            (result == kSecTrustResultProceed ||
             result == kSecTrustResultUnspecified)) {
                
                //驗(yàn)證成功,生成NSURLCredential憑證cred,告知challenge的sender使用這個(gè)憑證來(lái)繼續(xù)連接
                NSURLCredential *cred = [NSURLCredential credentialForTrust:trust];
                [challenge.sender useCredential:cred forAuthenticationChallenge:challenge];
                
            } else {
                
                //驗(yàn)證失敗,取消這次驗(yàn)證流程
                [challenge.sender cancelAuthenticationChallenge:challenge];
                
            }
    }
}

三.接收數(shù)據(jù)

- (void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [self.data appendData:data];
}

四.處理數(shù)據(jù)

- (void) connectionDidFinishLoading:(NSURLConnection *)connection {
    NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
    NSString *retStr = [[NSString alloc] initWithData:self.data encoding:enc];
    NSLog(@"retString:%@",retStr);
    NSData* newData=[retStr dataUsingEncoding:NSUTF8StringEncoding];
    NSError *error = nil;
    id responseObject = [NSJSONSerialization JSONObjectWithData:newData options:NSJSONReadingMutableLeaves error:&error];
    if (error) {
        NSLog(@"error:%@",error);
    }
    if (responseObject) {
        NSLog(@"%@", responseObject);
    }else{
        
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • AFHTTPRequestOperationManager 網(wǎng)絡(luò)傳輸協(xié)議UDP、TCP、Http、Socket、X...
    Carden閱讀 5,316評(píng)論 0 12
  • 在 WWDC 16 中,Apple 表示, 從 2017年1月1日起(最新消息, 實(shí)施時(shí)間已延期),所有新提交的 ...
    kmplayer閱讀 2,799評(píng)論 1 9
  • iOS網(wǎng)絡(luò)架構(gòu)討論梳理整理中。。。 其實(shí)如果沒(méi)有APIManager這一層是沒(méi)法使用delegate的,畢竟多個(gè)單...
    yhtang閱讀 5,474評(píng)論 1 23
  • 恍若 已隔三秋 飛絮輕吻著大地 夏蟬尚未高歌 幾許飛燕 啄春泥 棲于檐下 尚不知 三秋于你 又是 何般感受 是剎那...
    呦呦鹿鳴m閱讀 218評(píng)論 0 4

友情鏈接更多精彩內(nèi)容