关于http转https签名的意见

一.前言简介
之前开发一直使用的是http,但是临时突然要改成https,把我折腾一番.最后总算是解决了问题.
二.两种签名
1.自签
——>1.1.如果你们后台使用的是自签证书的形式,那么很有可能在你请求的时候会出现下面这种错误的提示

Error Domain=NSURLErrorDomain Code=-999 "已取消" UserInfo={NSErrorFailingURLKey=https://tsleasing.cs.xundatong.net/api/user/signout, NSLocalizedDescription=已取消, NSErrorFailingURLStringKey=https://tsleasing.cs.xundatong.net/api/user/signout}

——>1.2.为什么会有这种错误出现呢?因为AFN无法识别这种自签的证书.
——>1.3.怎么解决这种问题呢?请看下面代码

AFHTTPSessionManager *manager = [XFJOcsNetRequestClass xfj_ocs_managerWithBaseURL:nil sessionConfiguration:NO];
            if (httpHeaderParams.length != 0) {
                [manager.requestSerializer setValue:httpHeaderParams forHTTPHeaderField:@"X-Auth-Token"];
            }

            //这两行代码是解决上面出现的此种问题
            manager.securityPolicy.allowInvalidCertificates = YES;
            manager.securityPolicy.validatesDomainName = NO;

            [manager POST:url parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
                id dic = [XFJOcsNetRequestClass xfj_ocs_responseConfiguration:responseObject];

                success(task,dic);
            } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
                fail(task,error);
            }];
            break;

——>1.4.为什么要添加这两句代码?查了一下资料,这两句代码是使得访问的时候可以说是完全信任此证书,不管证书是有效还是无效,只要添加了这两句,都能访问通过.
2.权威颁发的证书
—–>2.1.如果后台配置的证书是权威颁发的证书,那么手机端什么都不需要做处理,那两行代码也不需要添加.AFN会自己处理.
三.另类解决办法(不安全)
1.查了一下资料有很多人是这么解决的,但是本人认为,这么做的话,很容易泄露证书,所以并未采取.下面直接上代码.

—–>1.1.代码块一:

+ (AFSecurityPolicy*)customSecurityPolicy {
    // /先导入证书
    NSString *cerPath = [[NSBundle mainBundle] pathForResource:certificate 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;

    securityPolicy.pinnedCertificates = @[certData];

    return securityPolicy;
}

—–>1.2.代码块二

+ (void)get:(NSString *)url params:(NSDictionary *)params success:(void (^)(id))success failure:(void (^)(NSError *))failure {
    // 1.获得请求管理者
    AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
    // 2.申明返回的结果是text/html类型
    mgr.responseSerializer = [AFHTTPResponseSerializer serializer];
    // 3.设置超时时间为10s
    mgr.requestSerializer.timeoutInterval = 10;

    // 加上这行代码,https ssl 验证。
    if(openHttpsSSL) {
        [mgr setSecurityPolicy:[self customSecurityPolicy]];
    }

    // 4.发送GET请求
    [mgr GET:url parameters:params success:^(AFHTTPRequestOperation *operation, id responseObj){
        if (success) {
            success(responseObj);
        }
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        if (error) {
            failure(error);
        }
    }];
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值