iOS 支持https

来源:互联网 发布:c语言中随机数怎么写 编辑:程序博客网 时间:2024/06/06 08:58

一、背景

6月14日在WWDC 2016开发者大会上,苹果宣布了一个最后期限:2017年1月1日起,所有提交到 App Store 的应用强制开启ATS(App Transport Security)安全功能。启用ATS后,它会屏蔽明文HTTP资源加载,强制App通过HTTPS连接网络服务,通过传输加密保障用户数据安全

ATS在 iOS 9 中默认开启,但开发者仍然可以选择使用 NSAllowsArbitraryLoads = YES 来关闭 ATS,继续通过HTTP连接传输数据。但从 2017 年 1 月 1 日起,这招将行不通了,所有提交到 App Store 的App必须强制开启 ATS,否则将无法通过App Store的审核,影响应用上架。

1月9日更新:苹果宣布暂时延长iOS强制ATS的最后期限,给开发者更多时间做好准备,还没有确认新的截止日期,随时可能再次执行强制ATS。建议开发者停止观望,在时间充裕的情况下,尽快完成HTTPS升级方案。

二、为什么强制使用HTTPS

    简单地说,HTTP是明文协议,通过该协议传输的数据处在被窃听、篡改、冒充这三大风险中,已经是非常不安全的传输协议。HTTPS是加密协议,就是在HTTP的基础上开启一条SSL加密通道,让原本明文“裸奔”的数据,从加密通道中密文传输,保证了数据传输的安全性。

这里写图片描述

//

//

三、如何排查APP 客户端是否支持https

客户端从iOS 9 SDK起默认开启ATS,一般无需进行代码改造。需要注意如下几点:

1)客户端需要以域名的方式连接服务器,IP地址形式的连接,是不符合ATS要求的。

2)客户端如果需要访问第三方服务器,或者内嵌了第三方提供的SDK,则需要确认第三方的服务端开启了ATS支持。

3)客户端工程中的Info.plist中,不能包含NSAllowsArbitraryLoads键及其他NSAllowsArbitrary*键。

注意以上几点,即可保证客户端支持ATS。

4)客户端内嵌入了第三方的SDK,不容易得知第三方服务是否开启ATS支持。检查的方式是,在开启确认客户端ATS支持后,进行功能测试,确认第三方提供的功能在ATS开启后还能正常运转。如果第三方提供的功能在ATS模式下无法正常运转,则表明其不支持ATS。

四、对于AFN(version >= 3.x) 客户端如何适配

 AFNetworking是iOS/OSX开发最流行的第三方开源库之一, AFNetworking 的安全相关设定放在AFSecurityPolicy。
AFNetworking定义了三种SSLpinningmode:AFSSLPinningModeNone: 代表客户端无条件地信任服务器端返回的证书AFSSLPinningModePublicKey : 代表客户端会将服务器端返回的证书与本地保存的证书PublicKey的部分进行校验;如果正确,才继续进行。AFSSLPinningModeCertificate: 代表客户端会将服务器端返回的证书和本地保存的证书中的所有内容,包括PublicKey和证书部分,全部进行校验;如果正确,才继续进行。(关于 pinning mode:简单的说就是你可以将SSL证书跟你的 APP 一起打包,藉由此机制来避免中间人伪造SSL证书的风险。)

以更加安全的AFSSLPinningModeCertificate验证模式为例(校验证书,不可以抓包)。

// 1.获得请求管理者  AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];  // 2.加上这个函数,https ssl 验证。  [manager setSecurityPolicy:[self customSecurityPolicy]];  // https ssl 验证函数    - (AFSecurityPolicy *)customSecurityPolicy {      // 先导入证书       NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"xxx" ofType:@"cer"];//证书的路径      NSData *cerData = [NSData dataWithContentsOfFile:cerPath];      // AFSSLPinningModeCertificate 使用证书验证模式      AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];         // allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO         //validatesDomainName 是否需要验证域名,默认为YES;//validatesCertificateChain 是否验证整个证书链,默认为YES;

当然你也可以(支持https,不校验证书,可以抓包查看)

    // 1.初始化单例类     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];    // 2.设置非校验证书模式    manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];    manager.securityPolicy.allowInvalidCertificates = YES;    [manager.securityPolicy setValidatesDomainName:NO];

证书分为两种,一种是花钱向认证的机构购买的证书,服务端如果使用的是这类证书的话,那一般客户端不需要做什么,用HTTPS进行请求就行了,苹果内置了那些受信任的根证书的。
另一种是自己制作的证书(自签名证书),使用这类证书的话是不受信任的(当然也不用花钱买),因此需要我们在代码中将该证书设置为信任证书。

帮助链接 : 使用自签名证书的教程

原创粉丝点击