iOS App使用HTTPS

Apple 为啥要强制使用HTTPS,在这里我不探讨,请自行Google或者度娘。
我在这里说说我们怎么去适配这条规则,以下个人见解,可能会存在不足,欢迎指出,一起进步。

  1. 其实我也是这两天才开始重视这件事情的,以前iOS9出的时候,当时为了偷懒(我们已经用的是HTTPS),就直接在info.iplist修改 NSAppTransportSecurity 这个属性,是这个样的:
NSAppTransportSecurity 
 
           
    NSAllowsArbitraryLoads
     

在 plist 文件里显示如下:


allowsArbitraryLoads.png
  1. 直到前两天,有个同事(另一个项目组的)也是在做这个HTTPS的适配(马上就要2017了),他就直接修改info.plist的字段NSAllowsArbitraryLoads为NO,但是,这样做并不能访问我们API的地址,原因可能是:我们的证书是公司自检证书,不支持Certificate Transparency。如果你的证书是有CA颁发的支持Certificate Transparency,以下内容可以忽略。

  2. 好了说到这里,是可以进入正题了。

如果服务器不符合ATS要求,参照 官方文档 App Transport Security Technote 对ATS 的介绍。

比如当你遇到以下三个不符合ATS要求的服务器域名时:
1. api.xxxdomain.com
2. cdn.domain.com
3. otherdomain.com

这个时候我们可以针对不同域名作如下操作:

  1. api.xxxdomain.com
    Info.plist 配置中的XML源码如下所示:
   NSAppTransportSecurity
   
       NSExceptionDomains
       
           api.xxxdomain.com
           
               
               NSExceptionAllowsInsecureHTTPLoads
               
               
               NSIncludesSubdomains
               
           
       
   

在 plist 文件里显示如下:


xxxdomain.png

我们定义的第一个“例外”(Exception)告诉ATS当与这个子域交互时撤销了必须使用HTTPS的要求。注意这个仅仅针对在“例外”(Exception)中声明的子域。非常重要的一点是要理解NSExceptionAllowsInsecureHTTPLoads关键字并不仅仅只是与使用HTTPS相关,这个“例外”(EXception)指明了对于那个域名,所有的App Transport Security的要求都被撤销了。

  1. cdn.domain.com
    Info.plist 配置中的XML源码如下所示:
   NSAppTransportSecurity
   
       NSExceptionDomains
       
           cdn.domain.com
           
               NSThirdPartyExceptionMinimumTLSVersion
               TLSv1.1
           
       
   

在 plist 文件里显示如下:


cdndomaim.png

很可能你的应用是与一个支持HTTPS传输数据的服务器交互,但是并没有使用TLS1.2或更高。在这种情况下,你定义一个例外(Exception),它指明应该使用的最小的TLS版本。这比完全撤销某个域名的App Transport Security要更好更安全。

  1. otherdomain.com
    Info.plist 配置中的XML源码如下所示:
      NSAppTransportSecurity
       
           NSExceptionDomains
           
               otherdomain.com
               
                   
                   NSIncludesSubdomains
                   
                   
                   NSExceptionAllowsInsecureHTTPLoads
                   
                   
                   NSExceptionMinimumTLSVersion
                   TLSv1.1
               
           
       

在 plist 文件里显示如下:

iOS App使用HTTPS_第1张图片
otherdomain.png

NSIncludesSubdomains关键字告诉App Transport Security 这个“例外”(Exception)适用于这个特定域名的所有子域。

  1. 如果你的APP中同时用到了以上三个域名,那应该是这样:
     NSAppTransportSecurity
        
            NSExceptionDomains
            
                api.xxxdomain.com
                
                    NSExceptionAllowsInsecureHTTPLoads
                    
                
                cdn.domain.com
                
                    NSThirdPartyExceptionMinimumTLSVersion
                    TLSv1.1
                
                otherdomain.com
                
                    NSIncludesSubdomains
                    
                
            
        
iOS App使用HTTPS_第2张图片
all.png

以上是对三种不同域名的适配,参考这里原文.

你可能感兴趣的:(iOS App使用HTTPS)