iOS适配https(一) -- AFNetworking

作者: 蛮荒星域 | 来源:发表于2017-01-09 14:48 被阅读316次

    前言

    根据苹果要求,2017必须要适配https。服务器端配置https需要一堆东西,这里就不详述了,主要介绍客户端的问题,而且是最简单的配置方式。

    有的没有配置证书只是简单设置了网络请求的security也成功了,这里介绍的方式是配置证书的,更安全更有保障度。

    这里先介绍AFNetworking的基本配置以及相关证书。

    一、配置证书

    1、服务器端证书配置好后可以给客户端一个证书,后缀是.crt的,拿到手后转成.der或.cer格式

    • .crt转.der方法 >

      openssl x509 -in Users/Jeffrey/ca.crt -out /Users/Jeffrey/ca.der -outform DER

    • .crt转.cer方法

      openssl x509 -in /Users/Jeffrey/ca.crt -out /Users/Jeffrey/ca.cer -outform DER

    这个方法没有测试成功,因为我们后台人员没有给我有效的证书。这个方法如果报错的话需要做相关验证。参考:https双向认证iOS客户端处理

    2、直接终端生成对应的cer证书
    这个方式会跳过服务器端给的证书一步,因为很多时候你们都不清楚到底要哪个证书,也不知道哪里会出现错误。

    直接看命令:

    openssl s_client -connect www.baidu.com:443 </dev/null 2>/dev/null | openssl x509 -outform DER > https.cer

    百度的域名换成自己公司的,注意不要加http或https。如果贵公司的域名的https还没有配置好,那么这步也会是无效的,会报错。

    Expecting: TRUSTED CERTIFICATE

    这个方法亲测有效!

    二、证书导入

    直接拖进去,记住这步。否则会没有读取到证书文件。


    tip.png

    三、AFNetworking单向验证设置

    由于网络库没有更新,所以这里使用的还是AFNetworking 2.6.0的相关配置,其实最近的也是一致的,配置的都是AFSecurityPolicy,是一致的。

    + (AFSecurityPolicy*)customSecurityPolicy
    {
        // 先导入证书 -- 这里要判断环境
        NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"server_staging" 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) {
            return securityPolicy;
        }
        securityPolicy.pinnedCertificates = @[certData];
        
        return securityPolicy;
    }
    

    这里建议统一设置,否则每次请求再单独添加会比较繁琐。

    _requestManager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:[KYConfig defaultConfig].serverHostURL];
            NSMutableSet *contentTypes = [_requestManager.responseSerializer.acceptableContentTypes mutableCopy];
            [contentTypes addObject:@"application/json"];
            _requestManager.responseSerializer.acceptableContentTypes = [contentTypes copy];
            _requestManager.securityPolicy = [KYHTTPManager customSecurityPolicy];        
    

    关于webView以及SDWebImage等后续篇章会继续介绍,敬请关注。

    下一篇:

    iOS适配https(二)-- 黑魔法简单适配SDWebImage

    相关参考:

    https双向认证iOS客户端处理
    iOS 迁移到HTTPS(自建证书+单向验证+AF3.0+WKWebView+SDWebImage)

    如果需要Demo请留言,会在后续版本中添加。

    相关文章

      网友评论

      • 维Fatal:收藏
      • 尧阿尧尧到外婆桥: _requestManager.securityPolicy = [KYHTTPManager customSecurityPolicy];
        这里的kyhttpmanager 对应的方法是什么可以说一下嘛
        尧阿尧尧到外婆桥:@蛮荒星域 但是我们ca证书是花钱的不是自建的,还要写这些验证?
        蛮荒星域:类似这样@interface KYHTTPManager : NSObject
        @property (nonatomic,strong)AFHTTPRequestOperationManager *requestManager;
        + (instancetype)sharedManager;

        - (void)reloadRequestUrl;


        - (void)GET:(NSString *)URLString
        parameters:(id)parameters
        success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
        failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure;
        蛮荒星域:@尧阿尧尧到外婆桥 KYHTTPManager是我封装的网络设置,这里用的类方法调用customSecurityPolicy ,你可以在你的封装里面调用实例方法就可以。建议封装,否则每个请求你都要设置一次。

      本文标题:iOS适配https(一) -- AFNetworking

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