iOS 适配HTTPS

一、后台给一个crt文件,需要转换成cer文件

openssl x509 -in后台给的.crt-out想要的名字.cer-outform der

二、托入到到项目中,并,并,这一步很重要,加入到build phress中

三、设置一个方法

- (AFSecurityPolicy*)customSecurityPolicy
{
    // /先导入证书
    NSString *cerPath =
    [[NSBundle mainBundle] pathForResource:@"server"
                                    ofType:@"cer"]; //证书的路径
    NSData *certData = [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 = NO;
    if (certData) {
        securityPolicy.pinnedCertificates = [NSSet setWithObject:certData];
    } else {
        CKKLog(@"----%@---", @"证书未找到或格式不匹配");
    }
    
    return securityPolicy;
}

四,访问网络时或者初始化时设置这个安全方案

……
#pragma mark  token加入
    NSString *token = [CKKLoginManager sharedManager].currentLoginData.token;
    if ([token hasValue] && ![token isEmpty]) {
        NSString *str = [NSString stringWithFormat:@"Bearer %@", token];
        [_manager.requestSerializer setValue:str forHTTPHeaderField:@"Authorization"];
    }
    
#pragma mark  响应变更
    // 默认的JOSN响应
    _manager.responseSerializer = [AFJSONResponseSerializer serializer];
    if ([api isEqualToString:@"auth/forgetPasswordCaptcha"]) {
        // 接收二进制流转换成图片
        _manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    }
#pragma mark - 证书配置
    
[_manager setSecurityPolicy:[self customSecurityPolicy]];

#pragma mark 分get post delete 发起请求
    // 准备开启task
    NSURLSessionDataTask *task = nil;
    if (method == RequestMethodGet) {

        task = [_manager GET:api parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {

            respondSuccessBlock(task, responseObject);
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

            respondErrorBlock(task, error);
        }];
    } else if (method == RequestMethodPost) {

……

info.plist文件别忘记了,允许所有的http访问

原文地址:https://www.cnblogs.com/songxing10000/p/6306047.html