Network 【HTTPS请求/AFN】

来源:互联网 发布:淘宝客服月薪一般多少 编辑:程序博客网 时间:2024/06/16 03:37

HTTPS请求过程

如下图:

    ① 客户端输入网址https://www.domain..com,连接到server的443端口。
    ② 服务器返回一个证书(包含公钥、和证书信息,如证书的颁发机构,过期时间等),证书由服务器所拥有的私钥非对称加密生成。
    ③ 客户端对证书进行验证(首先会验证证书是否有效,比如颁发机构,过期时间等等)。
    ④ 如果客户端验证通过,客户端生成一个随机数,在用服务器返回的证书(公钥)进行加密传输。
    ⑤ 因为公钥是通过服务器的私钥生成,所以服务器是可以对客户端的传回的加密数据进行对称解密的。服务器拿到由客户端生成的随机数,对要传递的数据使用随机数加密。
    ⑥ 客户端收到服务器使用随机数加密的数据进行解密。


       苹果已经封装了HTTPS连接的建立、数据的加密解密功能,我们直接可以访问https网站的,但苹果并没有验证证书是否合法,无法避免中间人攻击。要做到真正安全通讯,需要我们手动去验证服务端返回的证书。AFNetwork中的AFSecurityPolicy模块主要是用来验证HTTPS请求时证书是否正确。 AFSecurityPolicy封装了证书验证的过程,让用户可以轻易使用,除了去系统信任CA机构列表验证,还支持SSL  Pinning方式的验证。

       请求 信任的HTTPS 和 不信任的HTTPS 代码如下:

////  ViewController.m//  0720-01HTTPS请求(AFN)-01////  Created by 王中尧 on 16/7/20.//  Copyright © 2016年 wzy. All rights reserved.///* 使用AFN HTTPS 请求 如果发送的请求是HTTPS的请求,那么有两种情况 ----- 001 请求的网站所使用的证书是CA签名&加密的方式满足ATS的要求 那么我们在代码中什么都不需要做(比如说github官网,就是信任的https) 不管是信任,还是不信任,都要写:(设置反序列化方法) // 设置反序列化方法 manager.responseSerializer = [AFHTTPResponseSerializer serializer];  ----- 002 请求的网站所使用的证书是自签名,需要做如下操作:(比如说12306,就是不信任的https) 1) 禁用ATS特性 // 设置允许不受信任的证书(该参数默认为no) securityPolicy.allowInvalidCertificates = YES; // 设置不验证域名(该参数默认为yes) securityPolicy.validatesDomainName = NO;  2) 需要在代码中信任证书(安装) 在Info.plist 里面设置上两行属性(添加HTTP)  2017年1月1日 就不允许使用HTTP请求了 */#import "ViewController.h"#import "AFNetworking.h"@interface ViewController ()@end@implementation ViewController- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {    [self believe];//    [self unBelieve];}// 信任的HTTPS 百度- (void)believe {    // 创建会话管理者    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];        // 设置反序列化方法    manager.responseSerializer = [AFHTTPResponseSerializer serializer];        [manager GET:@"https://www.baidu.com" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {        NSLog(@"success---%@", [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]);    } failure:^(NSURLSessionDataTask *task, NSError *error) {        NSLog(@"failure---%@", error);    }];}// 不信任的HTTPS 12306官网- (void)unBelieve {    // 创建会话管理者    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];        // 设置反序列化方法    manager.responseSerializer = [AFHTTPResponseSerializer serializer];        /**     typedef NS_ENUM(NSUInteger, AFSSLPinningMode) {     AFSSLPinningModeNone, // 这个模式表示不做SSL pinning,只跟浏览器一样在系统的信任机构列表里验证服务端返回的证书。若证书是信任机构签发的就会通过,若是自己服务器生成的证书,这里是不会通过的     AFSSLPinningModePublicKey, // 这个模式同样是用证书绑定方式验证,客户端要有服务端的证书拷贝,只是验证时只验证证书里的公钥,不验证证书的有效期等信息     AFSSLPinningModeCertificate, // 这个模式表示用证书绑定方式验证证书,需要客户端保存有服务端的证书拷贝,这里验证分两步,第一步验证证书的域名/有效期等信息,第二步是对比服务端返回的证书跟客户端返回的是否一致     };     */    // AFNetwork中的AFSecurityPolicy模块主要是用来验证HTTPS请求时证书是否正确    // 验证证书的模式    AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];        /**     Whether or not to trust servers with an invalid or expired SSL certificates. Defaults to `NO`.     */    // 设置允许不受信任的证书    securityPolicy.allowInvalidCertificates = YES;        /**     Whether or not to validate the domain name in the certificate's CN field. Defaults to `YES` for `AFSSLPinningModePublicKey` or `AFSSLPinningModeCertificate`, otherwise `NO`.     */    // 设置不验证域名    securityPolicy.validatesDomainName = NO;        manager.securityPolicy = securityPolicy;        [manager GET:@"https://kyfw.12306.cn/otn" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {        NSLog(@"success---%@", [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]);    } failure:^(NSURLSessionDataTask *task, NSError *error) {        NSLog(@"failure---%@", error);    }];}@end


2 0
原创粉丝点击