博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

iOS9 Https技术预研

Posted on 2015-10-08 14:49  BradyChen  阅读(244)  评论(0编辑  收藏  举报

一、服务器需要做的事情:

 

1、要注意 App Transport Security 要求 TLS 1.2,

2、而且它要求站点使用支持forward secrecy协议的密码。

3、证书也要求是符合ATS规格的,ATS只信任知名CA颁发的证书,小公司所使用的 self signed certificate,还是会被ATS拦截。。因此慎重检查与你的应用交互的服务器是不是符合ATS的要求非常重要。

 

二、客户端可使用四种方案:

 

1、全部Https  2、俩者混合,个别不符合  3、 全部禁用Https   

4、  默认禁用https, 但是对于特殊站点,开启Https

 

1.

HTTPS Only (只有HTTPS,所有情况下都使用ATS)

如果你的应用只基于支持HTTPS的服务器,那么你太幸运了。你的应用不需要做任何改变。但是,注意App Transport Security要求TLS 1.2而且它要求站点使用支持forward secrecy协议的密码。证书也要求是符合ATS规格的。因此慎重检查与你的应用交互的服务器是不是符合ATS的要求非常重要。

2.

Mix & Match(混合)

你的应用与一个不符合ATS要求的服务器工作是很有可能的。在这种情况下,你需要告诉操作系统哪些站点是涉及到的然后在你的应用的 Info.plist文件中指明哪些要求没有达到。

3.

Opt Out(禁用ATS)

如果你在创建一个网页浏览器,那么你有一个更大的麻烦。因为你不可能知道你的用户将要访问那个网页,你不可能指明这些网页是否支持ATS要求且在HTTPS上传输。在这种情况下,除了全部撤销 App Transport Security 没有其它办法。

4.

Opt Out With Exceptions(除特殊情况外,都不使用ATS)

当你的应用撤消了App Transport Security,,但同时定义了一些例外。这非常有用就是当你的应用从很多的服务器上取数据,但是也要与一个你可控的API交互。在这种情况下,在应用的Info.plist文件中指定任何加载都是被允许的,但是你也指定了一个或多个例外来表明哪些是必须要求 App Transport Security的。

 

 

 

 

使用NSURLConnection支持HTTPS的实现

// Now start the connection

NSURL * httpsURL = [NSURL URLWithString:@"https://www.google.com"];

self.connection = [NSURLConnection connectionWithRequest:[NSURLRequest requestWithURL:httpsURL] delegate:self];

//回调

- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {

//1)获取trust object

SecTrustRef trust = challenge.protectionSpace.serverTrust;

SecTrustResultType result;

//2)SecTrustEvaluate对trust进行验证

OSStatus status = SecTrustEvaluate(trust, &result);

if (status == errSecSuccess &&

(result == kSecTrustResultProceed ||

result == kSecTrustResultUnspecified)) {

//3)验证成功,生成NSURLCredential凭证cred,告知challenge的sender使用这个凭证来继续连接

NSURLCredential *cred = [NSURLCredential credentialForTrust:trust];

[challenge.sender useCredential:cred forAuthenticationChallenge:challenge];

} else {

//5)验证失败,取消这次验证流程

[challenge.sender cancelAuthenticationChallenge:challenge];

}

 

}

使用AFNetworking来支持HTTPS

 

 

AFNetworking是iOS/OSX开发最流行的第三方开源库之一,其作者是非常著名的iOS/OSX开发者Mattt Thompson,其博客NSHipster也是iOS/OSX开发者学习和开阔技术视野的好地方。AFNetworking已经将上面的逻辑代码封装好,甚至更完善,在AFSecurityPolicy文件中,有兴趣可以阅读这个模块的代码;

 

AFNetworking上配置对HTTPS的支持非常简单:

 

NSURL * url = [NSURL URLWithString:@"https://www.google.com"];

AFHTTPRequestOperationManager * requestOperationManager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:url];

dispatch_queue_t requestQueue = dispatch_create_serial_queue_for_name("kRequestCompletionQueue");

requestOperationManager.completionQueue = requestQueue;

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 = YES;

 

//validatesCertificateChain 是否验证整个证书链,默认为YES

 

//设置为YES,会将服务器返回的Trust Object上的证书链与本地导入的证书进行对比,这就意味着,假如你的证书链是这样的:

//GeoTrust Global CA

// Google Internet Authority G2

// *.google.com

 

//那么,除了导入*.google.com之外,还需要导入证书链上所有的CA证书(GeoTrust Global CA, Google Internet Authority G2);

 

//如是自建证书的时候,可以设置为YES,增强安全性;假如是信任的CA所签发的证书,则建议关闭该验证,因为整个证书链一一比对是完全没有必要(请查看源代码);

securityPolicy.validatesCertificateChain = NO;

 

requestOperationManager.securityPolicy = securityPolicy;

 

 

这就是AFNetworking的支持HTTPS的主要配置说明,AFHTTPSessionManager与之基本一致,就不重复了。

 

 

客户端验证Https证书, 有服务器证书和客户端自建证书俩个证书来源, 到时候由服务器同学确定。

 

 

相关知识参考:

https://github.com/ChenYilong/iOS9AdaptationTips#1https-only-%E5%8F%AA%E6%9C%89https%E6%89%80%E6%9C%89%E6%83%85%E5%86%B5%E4%B8%8B%E9%83%BD%E4%BD%BF%E7%94%A8ats

 

 

http://mp.weixin.qq.com/s?__biz=MzAxMzE2Mjc2Ng==&mid=211889548&idx=1&sn=8eb4da781c32a7fd51c3ad552347f322&scene=23&srcid=0922zkxfLe07GKN3NfLh8b6k#rd