iOS https配置[本地测试]

之前的项目都是配置好的网络底层,对于其中某些细节不是很清晰,所以有空撸一遍.

流程:

1.找一个https的请求,demo以简书为例

2.把网页的Cer证书拖到工程里.

3.基于AFNet3.0封装一个网络请求层(NetManager)

4.配置安全策略

5.配置请求,响应的编码格式

6.发起请求,返回的数据进行解码,数据正确.

 

直接上代码

NetManager.m

+ (instancetype)share{

    static NetManager *manager;

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];

        manager = [[self alloc] initWithBaseURL:[NSURL URLWithString:@"https://www.jianshu.com"] sessionConfiguration:configuration];

        [manager setSecurityPolicy:[self customSecurityPolicy]];

        manager.requestSerializer = [AFHTTPRequestSerializer serializer];

        manager.responseSerializer = [AFHTTPResponseSerializer serializer];

    });

    

    return manager;

}

 

+ (AFSecurityPolicy *)customSecurityPolicy {

    // 先导入证书 证书由服务端生成,具体由服务端人员操作

    NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"*.jianshu.com" ofType:@"cer"];//证书的路径 xx.cer

    NSData *cerData = [NSData dataWithContentsOfFile:cerPath];

    

    // AFSSLPinningModeCertificate 使用证书验证模式

    AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];

    // allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO

    // 如果是需要验证自建证书,需要设置为YES

    securityPolicy.allowInvalidCertificates = YES;

    

    //validatesDomainName 是否需要验证域名,默认为YES;

    //假如证书的域名与你请求的域名不一致,需把该项设置为NO;如设成NO的话,即服务器使用其他可信任机构颁发的证书,也可以建立连接,这个非常危险,建议打开。

    //置为NO,主要用于这种情况:客户端请求的是子域名,而证书上的是另外一个域名。因为SSL证书上的域名是独立的,假如证书上注册的域名是www.google.com,那么mail.google.com是无法验证通过的;当然,有钱可以注册通配符的域名*.google.com,但这个还是比较贵的。

    //如置为NO,建议自己添加对应域名的校验逻辑。

    securityPolicy.validatesDomainName = YES;

    

    securityPolicy.pinnedCertificates = [[NSSet alloc] initWithObjects:cerData, nil];

    return securityPolicy;

}

 

请求部分:

- (void)viewDidLoad {

    [super viewDidLoad];

    [self afNetWorkingRequest];

}

 

-(void)afNetWorkingRequest{

    NetManager *session = [NetManager share];

    [session GET:@"https://www.jianshu.com/p/fa65eb0460dc" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {

        NSLog(@"成功");

        NSString *respons = [[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding];

        NSLog(@"respons:%@",respons);

    } failure:^(NSURLSessionDataTask *task, NSError *error) {

        NSLog(@"失败");

    }];

}

-(NetManager *)netManager{

    if (!_netManager) {

        _netManager = [[NetManager alloc]init];

    }

 

    return _netManager;

}

 

你可能感兴趣的:(iphone开发资料,Https请求)