年前给公司的项目适配了HTTPS,本来年前就该写这篇博客的,一直拖到现在才写。

本文的主要内容就是对整个适配过程做一个总结。网上有很多详细的教程,具体的适配过程本文就不再赘述了,这里主要总结一下我在适配过程中越到的问题以及一些经验。

测试自建证书

适配完成后可以使用自建证书进行测试,关于如何创建自建证书,网上有很多教程,可以自行百度。如果你使用的是AFNetworking框架,使用自建证书也非常简单,首先见证书(abc.cer)导入项目,然后加入代码如下:

self.sessionManager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];

AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
securityPolicy.allowInvalidCertificates = YES;
securityPolicy.validatesDomainName = YES;

NSString *path = [[NSBundle mainBundle] pathForResource:@"abc.cer" ofType:nil];
NSData *certData = [NSData dataWithContentsOfFile:path];
NSSet *set = [NSSet setWithObjects:certData, nil];
if (certData) {
    securityPolicy.pinnedCertificates = set;
}
self.sessionManager.securityPolicy = securityPolicy;

当然,正式环境还是需要使用CA机构颁发的证书,使用CA机构颁发的证书不需要导入证书,只需要加入以下代码即可:

self.sessionManager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];

AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
self.sessionManager.securityPolicy = securityPolicy;

配置NSExceptionDomains

项目中一些不能使用HTTPS协议的请求,需要配置NSExceptionDomains。很多第三方服务的请求还没有支持HTTPS,这就需要我们把这些请求添加到NSExceptionDomains中。可以使用Charles抓包看有哪些第三方请求需要添加到NSExceptionDomains中。

另外,为了防止域名劫持,项目中可能会直接使用IP进行请求,我再测试过程中发现,即使不添加NSExceptionDomains,直接使用IP也可以正常请求。

对于WebView里的请求,可以NSAllowsArbitraryLoadsInWebContent字段来声明绕过ATS。

对于多媒体播放请求(使用AVFoundation),可以使用NSAllowsArbitraryLoadsInMedia字段来声明绕过ATS。

多环境配置

一般公司服务器都会有多个环境(测试环境,正式环境等),证书一般只配置在正式环境上,这就要求我们在测试环境下需要关闭ATS。如果每次都手动修改Info.plist文件来关闭ATS,不但麻烦,也可能导致配置的信息丢失。一种比较好做法是创建多个Info.plist,根据不同的环境,自动切换使用不同的Info.plist。

如下,创建多个Info.plist

2

然后在Build Setting中配置不同的环境使用不同的Info.plist

3

这样做有一个不好的地方是如果修改了Info.plist文件,需要同时修改两个。但这也比每次切换环境修改Info.plist要好,因为毕竟修改Info.plist的情况还是比较少的。

以上就是我在适配HTTPS过程中遇到的一些问题,希望对大家有所帮助。

参考资料:

iOS开发适配HTTPS详细教程 关于iOS10中ATS的问题