美文网首页HTTPSiOSiOS技术中心
iOS-网络基础及应用-Https

iOS-网络基础及应用-Https

作者: panda_sheng | 来源:发表于2016-02-29 17:38 被阅读1805次

    HTTPS的基本使用

    1.https简单说明
        HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。
        即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。
        https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。
    
    2.HTTPS和HTTP的区别主要为以下四点:
            一、https协议需要到ca申请证书,一般免费证书很少,需要交费。
            二、http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
            三、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
            四、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
    
    3.对开发的影响。
    3.1 如果是自己使用NSURLSession来封装网络请求,涉及代码如下。
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    {
        NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    
        NSURLSessionDataTask *task =  [session dataTaskWithURL:[NSURL URLWithString:@"https://www.apple.com"] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
            NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
        }];
        [task resume];
    }
    
    /*
     只要请求的地址是HTTPS的, 就会调用这个代理方法
     我们需要在该方法中告诉系统, 是否信任服务器返回的证书
     Challenge: 挑战 质问 (包含了受保护的区域)
     protectionSpace : 受保护区域
     NSURLAuthenticationMethodServerTrust : 证书的类型是 服务器信任
     */
    - (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))completionHandler
    {
        //    NSLog(@"didReceiveChallenge %@", challenge.protectionSpace);
        NSLog(@"调用了最外层");
        // 1.判断服务器返回的证书类型, 是否是服务器信任
        if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
            NSLog(@"调用了里面这一层是服务器信任的证书");
            /*
             NSURLSessionAuthChallengeUseCredential = 0,                     使用证书
             NSURLSessionAuthChallengePerformDefaultHandling = 1,            忽略证书(默认的处理方式)
             NSURLSessionAuthChallengeCancelAuthenticationChallenge = 2,     忽略书证, 并取消这次请求
             NSURLSessionAuthChallengeRejectProtectionSpace = 3,            拒绝当前这一次, 下一次再询问
             */
    //        NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
    
            NSURLCredential *card = [[NSURLCredential alloc]initWithTrust:challenge.protectionSpace.serverTrust];
            completionHandler(NSURLSessionAuthChallengeUseCredential , card);
        }
    }
    
    
    

    如果是使用AFN框架,那么我们不需要做任何额外的操作,AFN内部已经做了处理。

    
        //1.设置对证书的处理方式
        manager.securityPolicy.allowInvalidCertificates = YES;
        manager.securityPolicy.validatesDomainName = NO;
        
       
    2.调用代理方法
    #pragma mark ----------------------
    #pragma mark NSURLSessionDataDelegate
    //如果发送的请求是https的,那么才会调用该方法
    //challenge 质询,挑战
    //NSURLAuthenticationMethodServerTrust
    -(void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler
    {
        if(![challenge.protectionSpace.authenticationMethod isEqualToString:@"NSURLAuthenticationMethodServerTrust"])
        {
            return;
        }
        NSLog(@"%@",challenge.protectionSpace);
        //NSURLSessionAuthChallengeDisposition 如何处理证书
        /*
         NSURLSessionAuthChallengeUseCredential = 0, 使用该证书 安装该证书
         NSURLSessionAuthChallengePerformDefaultHandling = 1, 默认采用的方式,该证书被忽略
         NSURLSessionAuthChallengeCancelAuthenticationChallenge = 2, 取消请求,证书忽略
         NSURLSessionAuthChallengeRejectProtectionSpace = 3,          拒绝
         */
        NSURLCredential *credential = [[NSURLCredential alloc]initWithTrust:challenge.protectionSpace.serverTrust];
        
        //NSURLCredential 授权信息
        completionHandler(NSURLSessionAuthChallengeUseCredential,credential);
    }
    
    @end
    

    相关文章

      网友评论

      • AnberZhi:NSURLCredential *card = [[NSURLCredential alloc]initWithTrust:challenge.protectionSpace.serverTrust];
        这个cerdential验证结果应该是通过你的cer证书验证的实际结果,而不是你初始化一个可trust的变量直接返回,相当于自己骗自己,没有校验,然后告诉代理这个证书是安全的。。。
      • 学到不懂为止:你好!我使用的是服务自签的证书.cer,Domain=NSURLErrorDomain Code=-1200 "发生了 SSL 错误,无法建立与该服务器的安全连接。" UserInfo={NSURLErrorFailingURLPeerTrustErrorKey=<SecTrustRef: 0x618000117850>, NSLocalizedRecoverySuggestion=您仍要连接此服务器吗?, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802, NSErrorPeerCertificateChainKey=(
        "<cert(0x7f958e834200) s: *.borui.lan i: boruicx>"
        ), NSUnderlyingError=0x618000241050 {Error Domain=kCFErrorDomainCFNetwork Code=-1200 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, kCFStreamPropertySSLPeerTrust=<SecTrustRef: 0x618000117850>, _kCFNetworkCFStreamSSLErrorOriginalValue=-9802, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802, kCFStreamPropertySSLPeerCertificates=(
        "<cert(0x7f958e834200) s: *.borui.lan i: boruicx>"
        )}}, NSLocalizedDescription=发生了 SSL 错误,无法建立与该服务器的安全连接。, NSErrorFailingURLKey=https://ysk.borui.lan/api.php?m=user&a=login&password=naidexingfu11&mobile=18650812637&os=ios&v=4, NSErrorFailingURLStringKey=https://ysk.borui.lan/api.php?m=user&a=login&password=naidexingfu11&mobile=18650812637&os=ios&v=4, NSErrorClientCertificateStateKey=0}
      • 陈阿琦:楼主,我的是afnetworking3.0,ios7.0 按照这样设置了 manager.securityPolicy.allowInvalidCertificates = YES; manager.securityPolicy.validatesDomainName = NO;
        https的请求一直都是超时,现在该怎么办呀
        里奇001:@陈阿琦 是不是服务器要求校验证书?
      • 5301e1741faf:谢谢分享,解决了我的问题 :+1:
        学到不懂为止:@5301e1741faf 你好!我使用的是服务自签的证书.cer,Domain=NSURLErrorDomain Code=-1200 "发生了 SSL 错误,无法建立与该服务器的安全连接。" UserInfo={NSURLErrorFailingURLPeerTrustErrorKey=<SecTrustRef: 0x618000117850>, NSLocalizedRecoverySuggestion=您仍要连接此服务器吗?, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802, NSErrorPeerCertificateChainKey=(
        "<cert(0x7f958e834200) s: *.borui.lan i: boruicx>"
        ), NSUnderlyingError=0x618000241050 {Error Domain=kCFErrorDomainCFNetwork Code=-1200 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, kCFStreamPropertySSLPeerTrust=<SecTrustRef: 0x618000117850>, _kCFNetworkCFStreamSSLErrorOriginalValue=-9802, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802, kCFStreamPropertySSLPeerCertificates=(
        "<cert(0x7f958e834200) s: *.borui.lan i: boruicx>"
        )}}, NSLocalizedDescription=发生了 SSL 错误,无法建立与该服务器的安全连接。, NSErrorFailingURLKey=https://ysk.borui.lan/api.php?m=user&a=login&password=naidexingfu11&mobile=18650812637&os=ios&v=4, NSErrorFailingURLStringKey=https://ysk.borui.lan/api.php?m=user&a=login&password=naidexingfu11&mobile=18650812637&os=ios&v=4, NSErrorClientCertificateStateKey=0}

      本文标题:iOS-网络基础及应用-Https

      本文链接:https://www.haomeiwen.com/subject/xwugkttx.html