iOS之https

最近应苹果要求,网络请求全部替换成https

一、前提介绍:

  • 必须是苹果信任的CA证书机构颁发的证书
  • 后台传输协议必须满足: TLS1.2 (这很重要。之前就是由于我们后台没升,导致卡顿了好几天!!!!)
  • 证书必须使用SHA256或者更好的哈希算法进行签名,要么是2048位或者更长的RSA密钥,要么就是256位或更长的ECC密钥
    目前有两种升级到HTTPS得方法:
    1.第三方认证的颁发CA证书(推荐,我们公司也是用的这种)
    2.自己制作证书(这种不知道能不能满足苹果的审核)

二、具体操作实现。(其实很简单。。。。。)

1.如果是第三方认证的颁发的CA证书,其实只用把http改为https 就可以了。。
2.然后在网络请求里面加这样的几行代码,如下:

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.requestSerializer = [AFHTTPRequestSerializer serializer];
    manager.responseSerializer = [AFJSONResponseSerializer serializer];
    [manager setSecurityPolicy:[YGHTTPClient customSecurityPolicy]];//这里是重点


+ (AFSecurityPolicy *)customSecurityPolicy
{
    //先导入证书,找到证书的路径
    //    NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"myWebsite" ofType:@"cer"];
    //    NSData *certData = [NSData dataWithContentsOfFile:cerPath];
    
    //AFSSLPinningModeCertificate 使用证书验证模式
    AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
    
    //allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO
    //如果是需要验证自建证书,需要设置为YES
    securityPolicy.allowInvalidCertificates = YES;
    
    //validatesDomainName 是否需要验证域名,默认为YES;
    //假如证书的域名与你请求的域名不一致,需把该项设置为NO;如设成NO的话,即服务器使用其他可信任机构颁发的证书,也可以建立连接,这个非常危险,建议打开。
    //置为NO,主要用于这种情况:客户端请求的是子域名,而证书上的是另外一个域名。因为SSL证书上的域名是独立的,假如证书上注册的域名是www.google.com,那么mail.google.com是无法验证通过的;当然,有钱可以注册通配符的域名*.google.com,但这个还是比较贵的。
    //如置为NO,建议自己添加对应域名的校验逻辑。
    securityPolicy.validatesDomainName = NO;
    //    NSSet *set = [[NSSet alloc] initWithObjects:certData, nil];
    //    securityPolicy.pinnedCertificates = set;
    return securityPolicy;
}

三、备注

1.由于我们客户端是没有证书的,所以采用不验证的方式。注释掉了找到证书路径等等代码,使用证书验证模式也改为了none。具体详情可看代码中注释。如果采取要验证的方式,客户端是需要证书的,让服务端生成一个子证书给你就可以了。
2.苹果是允许部分接口比如说流媒体是允许http的,但是要在info.plist 特殊配置一下。如果采用https,也要把允许http访问的那个ATS设置关掉。
3.我们也碰到一个问题,图片下载的时候改为https+ip访问,在ios9上是下载有问题,在ios9以上没问题,用https+域名访问也没问题。。研究许久,最后还是把图片下载改为http下载了~ 其他采用https。。。

你可能感兴趣的:(iOS之https)