HTTPS

作者: 952625a28d0d | 来源:发表于2017-02-24 22:58 被阅读38次

    如果项目使用的是AF做的网络请求,那么代码不用改

    • 客户端向服务器发送网络请求,服务器收到之后,不会立马给你返回数据,因为没有安全协议
    • 服务器向客户端下发安全证书
    • 客户端拿到证书之后,要做一件事情,就是信任证书
    • 证书中包含了非常重要的东西,就是公钥,那么信任证书的过程就是保存公钥,把公钥保存在本机
    • 那么再次发送信息的时候,服务器就认为你是一个安全的客户端,那么服务器会建立一个安全通道
    • 那么下次数据传输,就是通过公钥加密之后来进行传输的
    • 服务器拿到通过公钥加密之后的通过私钥加密
    • 客户端拿到服务器私钥加密之后的数据之后,通过公钥解密

    作为开发者?

    • 证书拿到手之后呢?选择信任还是不信任证书
    • 密码还是做一次加密比较好,虽然这个密码是公钥
    • 因为私钥在服务器上,那么私钥被泄露的可能性非常低
    p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #d12f1b}p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #000000; min-height: 21.0px}p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #703daa}p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #ba2da2}p.p5 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #000000}p.p6 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #3e1e81}p.p7 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #008400}p.p8 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px 'PingFang SC'; color: #008400}p.p9 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #78492a}p.p10 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #008400; min-height: 21.0px}span.s1 {font-variant-ligatures: no-common-ligatures; color: #78492a}span.s2 {font-variant-ligatures: no-common-ligatures}span.s3 {font-variant-ligatures: no-common-ligatures; color: #ba2da2}span.s4 {font-variant-ligatures: no-common-ligatures; color: #000000}span.s5 {font-variant-ligatures: no-common-ligatures; color: #4f8187}span.s6 {font: 18.0px Menlo; font-variant-ligatures: no-common-ligatures; color: #000000}span.s7 {font: 18.0px Menlo; font-variant-ligatures: no-common-ligatures}span.s8 {font-variant-ligatures: no-common-ligatures; color: #1337ff}span.s9 {font-variant-ligatures: no-common-ligatures; color: #703daa}span.s10 {font-variant-ligatures: no-common-ligatures; color: #3e1e81}span.s11 {font-variant-ligatures: no-common-ligatures; color: #d12f1b}span.s12 {font: 18.0px 'PingFang SC'; font-variant-ligatures: no-common-ligatures}span.s13 {font: 18.0px 'PingFang SC'; font-variant-ligatures: no-common-ligatures; color: #d12f1b}
    
    #import "ViewController.h"
    
    @interface ViewController ()<NSURLSessionDelegate>
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        
        // 有的时候Https访问我们可以直接拿到数据
        // 因为有的公司财大气粗 哥们有钱 可以认证
        // 但是很多公司的Https访问你这样是拿不到数据的 需要自己手动去信任
        // 认证过的HTTPS访问是强制安装证书的
    //    NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithURL:[NSURL URLWithString:@"https://www.apple.com"] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    //        NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
    //    }];
        NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
        NSURLSessionDataTask *task = [session dataTaskWithURL:[NSURL URLWithString:@"https://www.apple.com"] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
            NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
        }];
        [task resume];
    }
    
    #pragma mark -- 协议
    
    /**
     证书回调
    
     @param session session
     @param challenge 询问客户端是否信任来自服务器的证书
     属性:protectionSpace(受保护的空间)
     Auth-Scheme:NSURLAuthenticationMethosServerTrust 服务器返回的授权模式,要求信任我们的服务器证书
     @param completionHandler 成功的回调 通过这个代码块回调决定对我们证书的处理
     NSURLSessionAuthChallengeDisposition
     
          NSURLSessionAuthChallengeUseCredential 使用服务器发回证书(保存在challenge里面)
          NSURLSessionAuthChallengePerformDefaultHandling 默认处理方式 会忽略证书
          NSURLSessionAuthChallengeCancelAuthenticationChallenge    取消整个证书 忽略证书
          NSURLSessionAuthChallengeRejectProtectionSpace  本次拒绝 下次再试
     
     NSURLCredential 证书本身
     */
    - (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler{
        NSLog(@"%s",__FUNCTION__);
        // 1.判断服务器的身份验证方法是否是服务器信任的证书
        NSLog(@"%@",challenge.protectionSpace.authenticationMethod);
        if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
            NSLog(@"是服务器信任");
            // 2.获得证书
            NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
            // 3.对服务器的证书做出“处理”
            completionHandler(NSURLSessionAuthChallengeUseCredential,credential);
        }
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    @end```
    
    - 发现已经可以拿到数据了
    
    ###那么如果我们的项目中没有使用系统的NSURLSession来自己写网络请求呢?
    AFNetworking中已经帮我们做了,具体可以看AFNetworking源码中
    AFHTTPSessionManager

    相关文章

      网友评论

          本文标题:HTTPS

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