NSURLConnection实现HTTPS(SSL)链接请求

来源:互联网 发布:用什么看网络电视好 编辑:程序博客网 时间:2024/05/22 01:28

最近检测APP应用的网络请求,发现HTTP方式的接口,请求的数据比较容易让不道德的人截取并加以利用。所以建议接口请求数据的方式还是使用HTTPS(SSL),相对的安全些。

在iOS中,使用NSURLConnection来请求HTTPS,就需要处理SSL认证,NSURLConnectionDelegate中定义了处理认证的方法:

123
 connection:canAuthenticateAgainstProtectionSpace: connection:didReceiveAuthenticationChallenge:- connection:didCancelAuthenticationChallenge:

NSURLConnection中处理SSL

123
- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace{  return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust];}
  • 接收任何证书
123
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge{        [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];}
  • 使用私有证书验证
123456789101112131415161718192021222324252627
- (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方式传入即可。

12
 setAuthenticationAgainstProtectionSpaceBlock: setAuthenticationChallengeBlock:


0 0