您的当前位置:首页正文

iOS App使用HTTPS

来源:图艺博知识网
  1. 其实我也是这两天才开始重视这件事情的,以前iOS9出的时候,当时为了偷懒(我们已经用的是HTTPS),就直接在info.iplist修改 NSAppTransportSecurity 这个属性,是这个样的:
<key>NSAppTransportSecurity</key> 
<dict> 
    <!--彻底倒退回不安全的HTTP网络请求,能任意进行HTTP请求 (不建议这样做)-->       
    <key>NSAllowsArbitraryLoads</key>
    <true/> 
</dict>

在 plist 文件里显示如下:


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

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

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


  1. Info.plist 配置中的XML源码如下所示:
   <key>NSAppTransportSecurity</key>
   <dict>
       <key>NSExceptionDomains</key>
       <dict>
           
           <dict>
               <!--允许App进行不安全的HTTP请求-->
               <key>NSExceptionAllowsInsecureHTTPLoads</key>
               <true/>
               <!--适用于这个特定域名下的所有子域-->
               <key>NSIncludesSubdomains</key>
               <true/>
           </dict>
       </dict>
   </dict>

在 plist 文件里显示如下:


xxxdomain.png

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


  1. Info.plist 配置中的XML源码如下所示:
   <key>NSAppTransportSecurity</key>
   <dict>
       <key>NSExceptionDomains</key>
       <dict>
           
           <dict>
               <key>NSThirdPartyExceptionMinimumTLSVersion</key>
               <string>TLSv1.1</string>
           </dict>
       </dict>
   </dict>

在 plist 文件里显示如下:


cdndomaim.png

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


  1. Info.plist 配置中的XML源码如下所示:
      <key>NSAppTransportSecurity</key>
       <dict>
           <key>NSExceptionDomains</key>
           <dict>
               
               <dict>
                   <!--适用于这个特定域名下的所有子域-->
                   <key>NSIncludesSubdomains</key>
                   <true/>
                   <!--允许App进行不安全的HTTP请求-->
                   <key>NSExceptionAllowsInsecureHTTPLoads</key>
                   <true/>
                   <!--在这里声明所支持的 TLS 最低版本-->
                   <key>NSExceptionMinimumTLSVersion</key>
                   <string>TLSv1.1</string>
               </dict>
           </dict>
       </dict>

在 plist 文件里显示如下:

otherdomain.png
NSIncludesSubdomains关键字告诉App Transport Security 这个“例外”(Exception)适用于这个特定域名的所有子域。
  1. 如果你的APP中同时用到了以上三个域名,那应该是这样:
     <key>NSAppTransportSecurity</key>
        <dict>
            <key>NSExceptionDomains</key>
            <dict>
                
                <dict>
                    <key>NSExceptionAllowsInsecureHTTPLoads</key>
                    <false/>
                </dict>
                
                <dict>
                    <key>NSThirdPartyExceptionMinimumTLSVersion</key>
                    <string>TLSv1.1</string>
                </dict>
                
                <dict>
                    <key>NSIncludesSubdomains</key>
                    <true/>
                </dict>
            </dict>
        </dict>
all.png
Top