[iOS]網絡請求中的證書驗證-NSURLConnection

記錄一下在網絡請求中證書驗證的基于NSURLConnection的實現

一.開始一個請求

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    //保存數據
    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];
}

二.實現NSURLConnection驗證的回調方法

- (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)) {
                
                //驗證成功,生成NSURLCredential憑證cred,告知challenge的sender使用這個憑證來繼續連接
                NSURLCredential *cred = [NSURLCredential credentialForTrust:trust];
                [challenge.sender useCredential:cred forAuthenticationChallenge:challenge];
                
            } else {
                
                //驗證失敗,取消這次驗證流程
                [challenge.sender cancelAuthenticationChallenge:challenge];
                
            }
    }
}

三.接收數據

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

四.處理數據

- (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{
        
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

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