NSURLConnection實現HTTPS(SSL)鏈接請求

最近檢測APP應用的網絡請求,發現HTTP方式的接口,請求的數據比較容易讓不道德的人截取並加以利用。所以建議接口請求數據的方式還是使用HTTPS(SSL),相對的安全些。

在iOS中,使用NSURLConnection來請求HTTPS,就需要處理SSL認證,NSURLConnectionDelegate中定義了處理認證的方法:

1
2
3
 connection:canAuthenticateAgainstProtectionSpace:
 connection:didReceiveAuthenticationChallenge:
- connection:didCancelAuthenticationChallenge:

NSURLConnection中處理SSL

1
2
3
- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace{
  return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust];
}
  • 接收任何證書
1
2
3
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge{
        [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
}
  • 使用私有證書驗證
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
        static CFArrayRef certs;
        if (!certs) {
            NSData *certData =[NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"srca" ofType:@"cer"]];
            SecCertificateRef rootcert =SecCertificateCreateWithData(kCFAllocatorDefault,CFBridgingRetain(certData));
            const void *array[1] = { rootcert };
            certs = CFArrayCreate(NULL, array, 1, &kCFTypeArrayCallBacks);
            CFRelease(rootcert);    // for completeness, really does not matter
        }

        SecTrustRef trust = [[challenge protectionSpace] serverTrust];
        int err;
        SecTrustResultType trustResult = 0;
        err = SecTrustSetAnchorCertificates(trust, certs);
        if (err == noErr) {
            err = SecTrustEvaluate(trust,&trustResult);
        }
        CFRelease(trust);
        BOOL trusted = (err == noErr) && ((trustResult == kSecTrustResultProceed)||(trustResult == kSecTrustResultConfirm) || (trustResult == kSecTrustResultUnspecified));

        if (trusted) {
            [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
        }else{
            [challenge.sender cancelAuthenticationChallenge:challenge];
        }
}

AFNetWorking框架中處理SSL

使用AFURLConnectionOperation類的兩個方法,將上面的代碼以block方式傳入即可。

1
2
 setAuthenticationAgainstProtectionSpaceBlock:
 setAuthenticationChallengeBlock:


發佈了19 篇原創文章 · 獲贊 10 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章