最近应苹果要求,网络请求全部替换成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。。。