iOS开发之---UIWebView服务端证书校验

公司有个项目是金融类Web APP.UIWebView的壳子,内部嵌套html.这也是国内最近流行起来的开发模式.

项目是手机银行,所以为了提高安全性,iOS原生端加了服务端证书校验功能,下面开始进入正题!

星爷镇楼

尽管Https协议能够提供数据的加密、身份的认证等安全服务,但并不是没有漏洞。HTTPS协议安全隐患的存在可能使用户受到各种极具破坏力的网络攻击。其中中间人攻击(Man In The Middle, MITM)就是非常危险的一种攻击方式。

思想:将服务器信任的证书导入项目里面,每一次的网络请求都要校验是不是服务端信任的证书.否则终止网页加载!

欲哭无泪,只能学习

步骤1:通过谷歌浏览器获取信任证书

步骤2:直接上代码

2.1.协议遵守

@interface TargetViewController : UIViewController<UIWebViewDelegate, NSURLConnectionDelegate, NSURLConnectionDataDelegate>

2.2.将信任证书添加到数组中

NSArray *trustCerts = [NSMutableArray arrayWithObjects: @"TrustAsiaTLSRSACA.crt",@"gsorganizationvalsha2g2r1.crt", nil];

    self.trustedCerts = [NSMutableArray array];

    for(NSString*fileintrustCerts) {

        NSString*fpath = [[NSBundlemainBundle]pathForResource:fileofType:nil];

        NSData* cerData = [NSDatadataWithContentsOfFile:fpath];

        SecCertificateRefcertificate =SecCertificateCreateWithData(NULL, (__bridgeCFDataRef)(cerData));

        [self.trustedCertsaddObject:CFBridgingRelease(certificate)];

}

2.3:添加Https站点处理逻辑

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType

{

    NSLog(@"Did start loading: %@ auth:%d", [[request URL] absoluteString], _authenticated);

    NSURL*url1 = [requestURL];

    NSString*schema = [[url1scheme]lowercaseString];

    //未有过证书验证,将失败的请求纪录下来

    if([schemaisEqualToString:@"https"]){

        if(!_authenticated) {

            NSLog(@"Authenticated failed!");

            [self.indexWebViewstopLoading];

            [[[NSURLConnectionalloc]initWithRequest:requestdelegate:self]start] ;

            returnNO;

        }

    }

 return YES;

}

2.4:实现证书验证

- (void)connection:(NSURLConnection*)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge*)challenge;

{

    NSLog(@"WebController Got auth challange via NSURLConnection");

    if([challengepreviousFailureCount] ==0)

    {

        _authenticated = YES;

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

        [challenge.senderuseCredential:credentialforAuthenticationChallenge:challenge];

    }else

    {

        [[challengesender] cancelAuthenticationChallenge:challenge];

    }

}

- (void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse*)response;

{

    NSLog(@"WebController received response via NSURLConnection");

    _authenticated = YES;

    [self.indexWebView loadRequest:_request];

    [_urlConnection cancel];

}

如有问题,请留言评论! WKWebView的证书校验,有实现了或者想实现的话,一起研究下啊!

感谢论坛作者:http://www.cnblogs.com/lijizhuang/p/4884868.html 

感谢家里的老父老母!

再次鄙视我的SB室友!

有点想念没良心的前女友了!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • iOS开发系列--网络开发 概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博、微信等,这些应用本身可...
    lichengjin阅读 3,733评论 2 7
  • 根据广大开发者的传闻,2017年1月1号,苹果公司要执行ATS政策了。所有app必须强制支持https(不包括一些...
    简单日记阅读 2,170评论 2 7
  • 第一篇第二篇大概是把下载图片缓存图片的这个逻辑走完了,里面涉及好多类。 罗列一下 UIView+WebCache ...
    充满活力的早晨阅读 780评论 0 1
  • 经过一周的学习,我学习到了很多东西,也知道再小的个体也有自己的品牌。 企业有品牌,产品有品牌,我也应该有品牌。 为...
    叫我瞿勇阅读 143评论 0 0
  • 记事起,就特别的喜欢过年! 因为有美美的衣服,还有长辈的压岁钱,舅舅舅妈一家子都会回来,姥姥家特别热闹! 那个时候...
    我的晶晶阅读 221评论 1 7