• iOS开发中,Xcode 7.0也就是iOS9.0中开发中要求App内访问的网络必须使用HTTPS协议,以此来提高数据传输之间的安全性。  那么新创建的项目没用采用https怎么设置?如果发现在网络请求失败,Xcode后台报错信息为:...

    在iOS开发中,Xcode 7.0也就是iOS9.0中开发中要求App内访问的网络必须使用HTTPS协议,以此来提高数据传输之间的安全性。
           那么新创建的项目没用采用https怎么设置?如果发现在网络请求失败,Xcode后台报错信息为: 
    The resource could not be loaded because the App Transport Security policy requires the use of a secure connection. 
    (报错信息大概意思就是:资源数据不能被下载,因为App传输安全策略需要采用安全的连接方式)。
            解决方法:
           1、打开项目xcode,找到项目的plist文件,在Info.plist中添加NSAppTransportSecurity类型Dictionary。 具体图示如下所示:


          2、在NSAppTransportSecurity下添加NSAllowsArbitraryLoads类型Boolean,值设为YES。具体代码如下所示(建议直接复制粘贴下面几行代码到指定位置即可):
          <key>NSAppTransportSecurity</key>
                  <dict>
                         <key>NSAllowsArbitraryLoads</key>
                         <true/>
                  </dict>
            具体图示如下所示:

            需要注意的是:找到项目的info.plist,注意不是测试文件里面的plist。 

     

            以上就是本节全部内容,欢迎关注三掌柜的微信公众号,欢迎关注!

     

    展开全文
  • iOS9https网络适配

    2015-09-21 12:25:39
    1. iOS9网络适配_ATS:改用更安全的HTTPS [摘要]为了强制增强数据访问安全, iOS9 默认会把 所有的http请求 所有从NSURLConnection 、 CFURL、 NSURLSession发出的 HTTP 请求,都改为 HTTPS 请求:iOS9.x-SDK...

    1. iOS9网络适配_ATS:改用更安全的HTTPS

    [摘要]为了强制增强数据访问安全, iOS9 默认会把 所有的http请求 所有从NSURLConnection 、 CFURL、 NSURLSession发出的 HTTP 请求,都改为 HTTPS 请求:iOS9.x-SDK编译时,默认会让所有从NSURLConnection 、 CFURL 、 NSURLSession发出的 HTTP 请求统一采用TLS 1.2 协议。因为 AFNetworking 现在的版本底层使用了 NSURLConnection ,众多App将被影响(基于iOS8.x-SDK的App不受影响)。服务器因此需要更新,以解析相关数据。如不更新,可通过在 Info.plist 中声明,倒退回不安全的网络请求。而这一做法,官方文档称为ATS,全称为App Transport Security,是iOS9的一个新特性。

    一个符合 ATS 要求的 HTTPS,应该满足如下条件:

    1. Transport Layer Security协议版本要求TLS1.2以上
    2. 服务的Ciphers配置要求支持Forward Secrecy等
    3. 证书签名算法符合ATS要求等

    官方文档 App Transport Security Technote 对ATS 的介绍:

    enter image description here

    注:有童鞋反映:服务器已支持TLS 1.2 SSL ,但iOS9上还是不行,还要进行本文提出的适配操作。

    那是因为:要注意 App Transport Security 要求 TLS 1.2,而且它要求站点使用支持forward secrecy协议的密码。证书也要求是符合ATS规格的,ATS只信任知名CA颁发的证书,小公司所使用的 self signed certificate,还是会被ATS拦截。。因此慎重检查与你的应用交互的服务器是不是符合ATS的要求非常重要。对此,建议使用下文中给出的NSExceptionDomains,并将你们公司的域名挂在下面。下文也会详细描述该问题。

    官方文档 App Transport Security Technote 对CA颁发的证书要求:

    Certificates must be signed using a SHA256 or better signature hash algorithm, with either a 2048 bit or greater RSA key or a 256 bit or greater Elliptic-Curve (ECC) key. Invalid certificates result in a hard failure and no connection

    在讨论之前,跟往常一样,先说下iOS程序猿们最关心的问题:

    跟我有毛关系?需要我加班吗?!

    首先咱们来看下业内对Apple这一做法的评论:

    enter image description here

    这是某社交App上讨论,看来业内还是吐槽声和肯定声同在。

    结论是:

    跟你很有关系,加班吧,少年!

    书归正传【严肃脸】,我们正式讨论下 WHAT,WHY,HOW:

    1. WHAT(什么是SSL/TLS?跟HTTP和HTTPS有什么关系)
    2. WHY(以前的HTTP不是也能用吗?为什么要用SSL/TLS?!Apple是不是又在反人类?)
    3. HOW(如何适配?---弱弱地问下:加班要多久?)

    WHAT(什么是SSL/TLS?跟HTTP和HTTPS有什么关系)

    什么是SSL/TLS? SSL你一定知道,在此不做赘述。主要说下什么是TLS,还有跟HTTP和HTTPS有什么关系。

    TLS 是 SSL 新的别称:

    “TLS1.0”之于“SSL3.1”,犹“公元2015”之于“民国104”,“一千克”之于“一公斤”:称呼不同,意思相同。

    SSL 3.0版本之后的迭代版本被重新命名为TLS 1.0:TLS 1.0=SSL 3.1。所以我们平常也经常见到 “SSL/TLS” 这种说法。

    目前,应用最广泛的是TLS 1.0,接下来是SSL 3.0。目前主流浏览器都已经实现了TLS 1.2的支持。

    常用的有下面这些:

    • SSL 2.0
    • SSL 3.0
    • TLS 1.0 (SSL 3.1)
    • TLS 1.1 (SSL 3.1)
    • TLS 1.2 (SSL 3.1)

    那为什么标题是“使用HTTPS”而没有提及SSL和TLS什么事? “SSL/TLS”跟HTTP和HTTPS有什么关系?

    要理解这个,要看下他们之间的关系:

    HTTP+SSL/TLS+TCP = HTTPS

    HTTP+SSL/TLS+TCP

    或者

    HTTPS = “HTTP over SSL”

    也就是说:

    Apple让你的HTTP采用SSL/TLS协议,就是让你从HTTP转到HTTPS。而这一做法,官方文档称为ATS,全称为App Transport Security。

    WHY(以前的HTTP不是也能用吗?为什么要用SSL/TLS?Apple是不是又在反人类?)

    不使用SSL/TLS的HTTP通信,就是不加密的通信!

    不使用SSL/TLS的HTTP通信,所有信息明文传播,带来了三大风险:

    1. 窃听风险(eavesdropping):第三方可以获知通信内容。
    2. 篡改风险(tampering):第三方可以修改通信内容。
    3. 冒充风险(pretending):第三方可以冒充他人身份参与通信。

    SSL/TLS协议是为了解决这三大风险而设计的,希望达到:

    1. 所有信息都是加密传播,第三方无法窃听。
    2. 具有校验机制,一旦被篡改,通信双方会立刻发现。
    3. 配备身份证书,防止身份被冒充。

    SSL/TLS的作用,打个比方来讲:

    如果原来的 HTTP 是塑料水管,容易被戳破;那么如今新设计的 HTTPS 就像是在原有的塑料水管之外,再包一层金属水管(SSL/TLS协议)。一来,原有的塑料水管照样运行;二来,用金属加固了之后,不容易被戳破。

    HOW(如何适配?---弱弱地问下:加班要多久?)

    正如文章开头所说:

    TLS 1.2 协议 强制增强数据访问安全 系统 Foundation 框架下的“相关网络请求”将不再默认使用 HTTP 等不安全的网络协议,而默认采用 TLS 1.2。服务器因此需要更新,以解析相关数据。如不更新,可通过在 Info.plist 中声明,倒退回不安全的网络请求。

    总之:

    要么咱们iOS程序猿加班,要么后台加班:

    方案一:立即让公司的服务端升级使用TLS 1.2,以解析相关数据。

    方案二:虽Apple不建议,但可通过在 Info.plist 中声明,倒退回不安全的网络请求依然能让App访问指定http,甚至任意的http,具体做法见gif图,示例Demo见 Demo1

    enter image description here

    这也是官方文档和WWDC给出的解决方案:

    1. Apple官方文档enter image description here

    2. WWDC Session: "Networking with NSURLSession" session( 【WWDC 2015 session 703, “Privacy and Your App” O网页链接 】, 时间在30:18左右)

      enter image description here

      enter image description here

      enter image description here

    即使你的应用使用的是:你没有权限控制的CDN (Content Delivery Network),而且它不支持HTTPS!

    也别担心,Apple都替你考虑好了:

    enter image description here正如你在上图中看到的:苹果官方提供了一些可选配置项来决定是否开启ATS模式,也就是可以选择开启或者不开启。

    开发者可以针对某些确定的URL不使用ATS,这需要在工程中的info.plist中标记NSExceptionDomains。在NSExceptionDomains字典中,可以显式的指定一些不使用ATS的URL。这些你可以使用的例子可以是:

    • NSIncludesSubdomains

    • NSExceptionAllowInsecureHTTPLoads

    • NSExceptionRequiresForwardSecrecy

    • NSExceptionMinimumTLSVersion

    • NSThirdPartyExceptionAllowsInsecureHTTPLoads

    • NSThirdPartyExceptionMinimumTLSVersion

    • NSThirdPartyExceptionRequiresForwardSecrecy

    这些关键字使我们可以更加细致的设置针对不使用ATS的域名情况下禁用ATS或者一些特殊的ATS选项。

    你可能注意到一些关键字像是使用了一些其他关键字中的词但是在前面加上了"ThirdParty"字样,比如列表里最后三个:

    • NSThirdPartyExceptionAllowsInsecureHTTPLoads

    • NSThirdPartyExceptionMinimumTLSVersion

    • NSThirdPartyExceptionRequiresForwardSecrecy

    在功能上,这些关键字与不含有"ThirdParty"的关键字有同样的效果。而且实际运行中所调用的代码将会完全忽略是否使用"ThirdParty"关键字。你应该使用适用于你的场景的关键字而不必过多考虑这些。

    关于App Transport Security,每个应用都属于4个大类当中的一类。我们来看看每一个大类都是怎样影响应用的。

    -- 分类名 解释
    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的。

    下面分别做一下介绍:

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

    如果你的应用只基于支持HTTPS的服务器,那么你太幸运了。你的应用不需要做任何改变。

    唯一需要做的事情就是使用 NSURLSession 。如果你的开发目标是iOS 9或者 OS X EI Capitan之后,ATS 的最佳实践将会应用到所有基于 NSURLSession 的网络。

    但也有人遇到过这样的疑惑:服务器已支持TLS 1.2 SSL ,但iOS9上还是不行,还要进行本文提出的适配操作。

    那是因为:要注意 App Transport Security 要求 TLS 1.2,而且它要求站点使用支持forward secrecy协议的密码。证书也要求是符合ATS规格的,ATS只信任知名CA颁发的证书,小公司所使用的 self signed certificate,还是会被ATS拦截。。因此慎重检查与你的应用交互的服务器是不是符合ATS的要求非常重要。对此,建议使用下文中给出的NSExceptionDomains,并将你们公司的域名挂在下面。

    官方文档 App Transport Security Technote 对CA颁发的证书要求:

    Certificates must be signed using a SHA256 or better signature hash algorithm, with either a 2048 bit or greater RSA key or a 256 bit or greater Elliptic-Curve (ECC) key. Invalid certificates result in a hard failure and no connection

    2.Mix & Match(混合)

    你的应用与一个不符合ATS要求的服务器工作是很有可能的,

    当你遇到以下三个不符合 ATS 要求的服务器的域名时:

    1. api.insecuredomain.com
    2. cdn.domain.com
    3. thatotherdomain.com

    你可以分别设置如下:

    1. api.insecuredomain.com

      Info.plist 配置中的XML源码如下所示:

            <key>NSAppTransportSecurity</key>
            <dict>
                <key>NSExceptionDomains</key>
                <dict>
                    <key>api.insecuredomain.com</key>
                    <dict>
                        <key>NSExceptionAllowsInsecureHTTPLoads</key>
                        <false/>
                    </dict>
                </dict>
            </dict>

      在 plist 文件里显示如下:

      enter image description here

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

    2. cdn.domain.com Info.plist 配置中的XML源码如下所示:

        <key>NSAppTransportSecurity</key>
        <dict>
            <key>NSExceptionDomains</key>
            <dict>
                <key>cdn.somedomain.com</key>
                <dict>
                    <key>NSThirdPartyExceptionMinimumTLSVersion</key>
                    <string>TLSv1.1</string>
                </dict>
            </dict>
        </dict>

      在 plist 文件里显示如下:

      enter image description here

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

    3. thatotherdomain.com

      Info.plist 配置中的XML源码如下所示:

           <key>NSAppTransportSecurity</key>
            <dict>
                <key>NSExceptionDomains</key>
                <dict>
                    <key>thatotherdomain.com</key>
                    <dict>
                        <!--适用于这个特定域名下的所有子域-->
                        <key>NSIncludesSubdomains</key>
                        <true/>
                        <!--扩展可接受的密码列表:这个域名可以使用不支持 forward secrecy 协议的密码-->
                        <key>NSExceptionRequiresForwardSecrecy</key>
                        <false/>
                        <!--允许App进行不安全的HTTP请求-->
                        <key>NSExceptionAllowsInsecureHTTPLoads</key>
                        <true/>
                        <!--在这里声明所支持的 TLS 最低版本-->
                        <key>NSExceptionMinimumTLSVersion</key>
                        <string>TLSv1.1</string>
                    </dict>
                </dict>
            </dict>

      在 plist 文件里显示如下:

      enter image description here

      NSIncludesSubdomains 关键字告诉 App Transport Security 这个“例外”(Exception)适用于这个特定域名的所有子域。这个“例外”(Exception)还进一步通过扩展可接受的密码列表来定义这个域名可以使用不支持forward secrecy( NSExceptionRequiresForwardSecrecy ) 协议的密码。想了解更多关于forward secrecy的信息,推荐去看官方文档 Apple's technote 

    如果你的App中同时用到了这三个域名,那么应该是这样:

         <key>NSAppTransportSecurity</key>
            <dict>
                <key>NSExceptionDomains</key>
                <dict>
                    <key>api.insecuredomain.com</key>
                    <dict>
                        <key>NSExceptionAllowsInsecureHTTPLoads</key>
                        <false/>
                    </dict>
                    <key>cdn.somedomain.com</key>
                    <dict>
                        <key>NSThirdPartyExceptionMinimumTLSVersion</key>
                        <string>TLSv1.1</string>
                    </dict>
                    <key>thatotherdomain.com</key>
                    <dict>
                        <key>NSIncludesSubdomains</key>
                        <true/>
                        <key>NSExceptionRequiresForwardSecrecy</key>
                        <false/>
                    </dict>
                </dict>
            </dict>

    enter image description here

    3. Opt Out(禁用ATS)

    上面是比较严谨的做法,指定了能访问哪些特定的HTTP。当然也有暴力的做法: 彻底倒退回不安全的HTTP网络请求,能任意进行HTTP请求,比如你在开发一款浏览器App,或者你想偷懒,或者后台想偷懒,或者公司不给你升级服务器。。。

    你可以在Info.plist 配置中改用下面的XML源码:

        <key>NSAppTransportSecurity</key>
        <dict>
            <!--彻底倒退回不安全的HTTP网络请求,能任意进行HTTP请求 (不建议这样做)-->
            <key>NSAllowsArbitraryLoads</key>
            <true/>
        </dict>

    在 plist 文件里显示如下:

    enter image description here

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

    上面已经介绍了三种情景,还有一种可能你也会遇到:

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

    <key>NSAppTransportSecurity</key>
            <dict>
                <key>NSAllowsArbitraryLoads</key>
                <true/>
                <key>NSExceptionDomains</key>
                <dict>
                    <key>api.tutsplus.com</key>
                    <dict>
                        <key>NSExceptionAllowsInsecureHTTPLoads</key>
                        <false/>
                    </dict>
                </dict>
            </dict>

    在 plist 文件里显示如下:

    enter image description here

    【注:以上在Info.plist配置中的做法已经验证可行,但目前Apple的prerelease版本的官方文档并未提及Info.plist中配置的代码,我将密切关注官方文档,如有提及,再来更新本文 .你若发现官方文档有提及了,也可在微博@iOS程序犭袁通知下我。】(官方文档已经有阐述)

    Certificate Transparency

    虽然ATS大多数安全特性都是默认可用的,Certificate Transparency 是必须设置的。如果你有支持Certificate Transparency的证书,你可以检查NSRequiresCertificateTransparency关键字来使用Certificate Transparency。再次强调,如果你的证书不支持Certificate Transparency,此项需要设置为不可用。

    如果需要调试一些由于采用了ATS而产生的问题,需要设置CFNETWORK_DIAGNOSTICS为1,这样就会打印出包含被访问的URL和ATS错误在内的NSURLSession错误信息。要确保处理了遇到的所有的错误消息,这样才能使ATS易于提高可靠性和扩展性。

    Q-A

    Q:我用xcode7编译的app,如果不在plist里面加关键字说明,ios9下不能进行网络请求,因为我们服务器并不支持 TLS 1.2 ,我要是直接下载app store上的,什么也没有做,也是能正常网络请求。

    A:本文中所罗列的新特性,多数情况下指的是 iOS9.X-SDK 新特性,AppStore 的版本是基于 iOS8.X-SDK或 iOS7.X-SDK,所以并不受 iOS9新特性约束。也就是说:Xcode7给iOS8打设备包可以请求到网络,Xcode7给iOS9设备打的包请求不到网络,Xcode7和iOS9缺一不可,才需要网络适配ATS。

    那么,如何确认自己项目所使用的 SDK?在Targets->Build Setting-->Architectures

    enter image description here

    Q:服务器已支持TLS 1.2 SSL ,但iOS9上还是不行,还要进行本文提出的适配操作。

    A:那是因为:要注意 App Transport Security 要求 TLS 1.2,而且它要求站点使用支持forward secrecy协议的密码。证书也要求是符合ATS规格的,ATS只信任知名CA颁发的证书,小公司所使用的 self signed certificate,还是会被ATS拦截。。因此慎重检查与你的应用交互的服务器是不是符合ATS的要求非常重要。对此,建议使用下文中给出的NSExceptionDomains,并将你们公司的域名挂在下面。

    官方文档 App Transport Security Technote 对CA颁发的证书要求:

    Certificates must be signed using a SHA256 or better signature hash algorithm, with either a 2048 bit or greater RSA key or a 256 bit or greater Elliptic-Curve (ECC) key. Invalid certificates result in a hard failure and no connection

    Q:我使用的是第三方的网络框架,比如 AFNetworking 、ASIHTTPRequest、CFSocket 等,这个有影响没有?

    A: AFNetworking 有影响,其它没影响。

    ATS 是只针对 NSURLConnection 、 CFURL 、 NSURLSession ,如果底层涉及到这三个类就会有影响。

    现在的 AFNetworking 的 AFHTTPRequestOperationManager 实现是使用的 NSURLConnection 。

    但 AFNetworking 也有更新计划,移除 NSURLConnection 相关API,迁移到 AFHTTPSessionManager ,但还未执行,详情见:https://github.com/AFNetworking/AFNetworking/issues/2806

    Q:试了一下禁用 ATS 的方法 但是还是无法联网 仍然提示要使用https?

    App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.

    The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.

    A:遇到这类问题,90%是出现在“一个 Project 多 Target ”的情况下,所以 请确保你修改的,确实是你的 Target 所属的 Info.plist !

    如何确认?请前往这里,确认你 Target 所属的 Info.plist 究竟是哪个:

    Project -> Your Target -> Build Settings -> Info.plist File

    enter image description here

    或者更直截了当一点,直接修改:

    Project -> Your Target —>info-> Custom iOS target properties-> 添加禁用 ATS 的属性

    enter image description here

    Q:我的项目是“一个 Project 多 Target ”,按照本文禁用 ATS 的方法,是不是每个 Info.plist 都要修改?

    A:不需要,用到哪个 Target 修改哪个的 Info.plist ,Target 是独立的,不受其他 Target 的影响,也不会影响其他 Target。

    Q:如何检测我们公司 HTTPS 是否符合 ATS 的要求?

    A: 如果你的 App 的服务也在升级以适配ATS要求,可以使用如下的方式进行校验:

    在OS X EI Capitan系统的终端中通过nscurl命令来诊断检查你的HTTPS服务配置是否满足Apple的ATS要求:

     $ nscurl --verbose --ats-diagnostics https://<your_server_domain>

    当然,你也可以让公司服务端的同事参考Apple提供官方指南App Transport Security Technote进行服务的升级配置以满足ATS的要求:

    一个符合 ATS 要求的 HTTPS,应该满足如下条件:

    1. Transport Layer Security协议版本要求TLS1.2以上
    2. 服务的Ciphers配置要求支持Forward Secrecy等
    3. 证书签名算法符合ATS要求等
    展开全文
  • iOS9https设置info.plist

    2016-11-11 13:40:28
    iOS9https设置info.plistXcode 7.0也就是iOS9.0中开发要求App内访问的网络必须使用HTTPS协议。那么我们公司没用采用https怎么办?如果发现网络请求失败,Xcode后台报错信息为: The resource could not be loaded ...

    iOS9https设置info.plist

    Xcode 7.0也就是iOS9.0中开发要求App内访问的网络必须使用HTTPS协议。那么我们公司没用采用https怎么办?如果发现网络请求失败,Xcode后台报错信息为:
    The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.
    (大概意思就是:资源数据不能被下载,因为APP传输安全策略需要采用安全的连接方式)。

    解决方法:

    在Info.plist中添加NSAppTransportSecurity类型Dictionary。
    在NSAppTransportSecurity下添加NSAllowsArbitraryLoads类型Boolean,值设为YES

        <key>NSAppTransportSecurity</key>
        <dict>
              <key>NSAllowsArbitraryLoads</key>
              <true/>
        </dict>
    

    找到info.plist,注意不是测试文件里面的plist哦。
    操作见GIF图。千言万语,不如一张图。iOS9设置https

    另外博主维护一个iOS开发技术支持群:479259423,进群必须改名,群名片格式:城市-iOS-名字,例如广州-iOS-文明。

    展开全文
  • iOS9推出的时候,苹果希望大家使用https协议,来提高数据传输之间的安全性。下面我就从最简单的代码介绍,如何在工程中设置,来支持https的请求。 一、证书准备篇 1.证书转换 在服务器人员,给你发送的crt证书后...

    iOS9推出的时候,苹果希望大家使用https协议,来提高数据传输之间的安全性。下面我就从最简单的代码介绍,如何在工程中设置,来支持https的请求。

    一、证书准备篇

    • 1.证书转换
      在服务器人员,给你发送的crt证书后,进到证书路径,执行下面语句
      // openssl x509 -in 你的证书.crt -out 你的证书.cer -outform der
      这样你就可以得到cer类型的证书了。双击,导入电脑。
    • 2.证书放入工程
      1、可以直接把转换好的cer文件拖动到工程中。
      2、可以在钥匙串内,找到你导入的证书,单击右键,导出项目,就可以导出.cer文件的证书了

    二、代码修改篇

    先在info.plist中,增加如下图的配置


    文本内容如下:

     <key>NSAppTransportSecurity</key>
        <dict>
            <key>NSAllowsArbitraryLoads</key>
            <true/>
        </dict>

    三、网络请求发送篇

    1.使用系统类发送网络请求篇

    1.1 NSURLConnection设置支持https。

    在2015年iOS9的更新中,NSURLConnection 被废弃 由 NSURLSession 取代,所以本身是不建议大家继续用这个类做网络请求的(同样也有AFNetWorking 2.x版本),但是考虑到一些旧程序,也不能说改就改,说替换就替换的,所以还是需要普及一下,如果用到了NSURLConnection你需要怎么做。

    代码如下:

    - (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge{
    
        if(challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust) {
            // 告诉服务器,客户端信任证书
            // 创建凭据对象
            NSURLCredential *credntial = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
            // 告诉服务器信任证书
            [challenge.sender useCredential:credntial forAuthenticationChallenge:challenge];
        }
    }

    你只需要简单的,添加上如上的代理方法,就可以在不影响你原有请求的基础上,增加了https请求的支持了。

    1.2 NSURLSession设置支持https。

    现在推荐使用的就是NSURLSession来处理相关的网络请求了,如果使用系统自带的类,可以参考如下代码:

    - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task  didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * __nullable credential))completionHandler {
    
        // 判断是否是信任服务器证书
        if(challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust) {
            // 告诉服务器,客户端信任证书
            // 创建凭据对象
            NSURLCredential *credntial = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
            // 通过completionHandler告诉服务器信任证书
            completionHandler(NSURLSessionAuthChallengeUseCredential,credntial);
        }
        NSLog(@"protectionSpace = %@",challenge.protectionSpace);
    }

    2.使用AFNetWorking发送网络请求篇

    AFNetworking是一个讨人喜欢的网络库,适用于iOS以及Mac OS X. 它构建于在NSURLConnection, NSOperation, 以及其他熟悉的Foundation技术之上. 它拥有良好的架构,丰富的api,以及模块化构建方式,使得使用起来非常轻松.。

    2.1 AFNetWorking 2.x版本

    考虑到这个版本,我们还可以使用AFHTTPRequestOperationManager这个类来处理网络请求。所以我们要做的就是给这个类,设置一些参数,让它可以支持https的请求,代码如下:

    支持https(校验证书,不可以抓包):

        // 1.初始化单例类
        AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
        mgr.securityPolicy.SSLPinningMode = AFSSLPinningModeCertificate;
        // 2.设置证书模式
        NSString * cerPath = [[NSBundle mainBundle] pathForResource:@"xxx" ofType:@"cer"];
        NSData * cerData = [NSData dataWithContentsOfFile:cerPath];
        mgr.securityPolicy.pinnedCertificates = [[NSArray alloc] initWithObjects:cerData, nil];
        // 客户端是否信任非法证书
        mgr.securityPolicy.allowInvalidCertificates = YES;
        // 是否在证书域字段中验证域名
        [mgr.securityPolicy setValidatesDomainName:NO];

    支持https(不校验证书,可以抓包查看):

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

    2.2 AFNetWorking 3.x版本

    在Xcode7.0之后,苹果废弃了NSURLConnection方法,数据请求使用NSURLSession,作为网络请求类第三方库使用量最大的AFN也及时的更新的新的版本——AFN 3.0版本。新的版本的里废弃了基于NSURLConnection封装的AFHTTPRequestOperationManager,转而使用基于NSURLSession封装的AFHTTPSessionManager了。

    支持https(校验证书,不可以抓包):

        // 1.初始化单例类
         AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
        manager.securityPolicy.SSLPinningMode = AFSSLPinningModeCertificate;
        // 2.设置证书模式
        NSString * cerPath = [[NSBundle mainBundle] pathForResource:@"xxx" ofType:@"cer"];
        NSData * cerData = [NSData dataWithContentsOfFile:cerPath];
        manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate withPinnedCertificates:[[NSSet alloc] initWithObjects:cerData, nil]];
        // 客户端是否信任非法证书
        mgr.securityPolicy.allowInvalidCertificates = YES;
        // 是否在证书域字段中验证域名
        [mgr.securityPolicy setValidatesDomainName:NO];

    支持https(不校验证书,可以抓包查看):

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

    2016-12-15 22:48:05
    iOS配置HTTPS的详解

    引言

    所有iOS的开发者都应该知道,2016年以来苹果在不断地收紧对于HTTP网络连接的限制,强力推行全部使用HTTPS进行网络连接。之前还能有手段能绕过这个问题,而到了2017年1月1日,将要求所有App必须使用HTTPS。所以iOS开发者们不得不被逼着上HTTPS,但是这似乎也带来了一个好处,后面再说。

    HTTPS

    先说说HTTPS是什么。

    大家以前用的都是HTTP协议进行网络连接,用的太多了以致很多人甚至不会注意到它。但是用HTTP也有一些问题:

    • 通信内容使用的是明文传输,就可能会被窃听。
    • 没有对通信方的身份进行验证,就可能被伪造身份。
    • 无法证明报文的完整性,就可能被篡改内容。

    而HTTPS就是为了防止以上问题而出现的:

    HTTP + 加密 + 认证 + 完整性保护 = HTTPS

    需要注意的是,HTTPS并不是一种新协议,只是HTTP通信接口部分使用SSL和TLS协议代替而已。通常HTTP直接和TCP通信,当使用SSL时,就演变成先和SSL通信,再由SSL和TCP通信了。

    怎么实现加密的呢?通常我们可以直接使用同一个密钥在客户端和服务端进行加解密,但是如果这个密钥泄露了,就无法到达加密的目的了。还有一种加密方式是非对称性的公开密钥加密,有一个公钥和一个私钥,公钥,公钥是公开的,私钥是自己保存的,这样就可以实现彻底加密了。但是这种方式比较耗时,因此HTTPS的做法是:建立连接时先用耗时的非对称性公开密钥进行通信,将后续要使用的共享密钥进行传输,这样密钥就安全地传输了,之后再使用比较高效的共享密钥加密方式,使用秘密传输的密钥进行加解密。

    然而公钥依然存在问题,可能会被替换或者别的情况,因此出现了一些数字证书认证机构颁发的公钥,也就是数字证书。遗憾的是,这种证书往往都需要缴纳费用来使用,因此很多系统都依然使用自己生成的证书来进行通信,我们使用浏览器时有时在访问https网站时看到绿色的锁,就说明是正规的数字证书认证机构颁发的证书,如果是自生成的就是红色的锁,这时浏览器也会提醒你网站可能是不安全的。比较著名的例子就是12306。

    使用正规机构颁发的证书还有一个好处就是,这些证书往往已经存在于浏览器、iOS、Android中了, 也就是说如果使用这些证书,浏览器、iOS、Android都可以自动识别,不需要做任何配置。但如果使用自生成的证书,则需要下载安装证书,或者在App工程中配置自生成的证书文件。带来的后果就是用户体验的不足以及可能的应用商店审核被拒。

    关于以上内容,有一本书可以推荐一下,写的简明易懂:《图解HTTP》

    iOS配置HTTPS

    正规证书

    上面说了,如果是正规的数字证书认证机构颁发的证书,就不需要进行任何配置,记得将url前面加上https即可正常访问,达到加密以及通过审核的目的。但是缺点是要钱,而且费用不低。

    但是!好消息!好消息!好消息!!!

    阿里云和腾讯云现在提供免费的正规证书使用了!

    腾讯云提供的没用不清楚,但是阿里云提供的免费证书有效期为一年,一年后能不能重新免费再配一个就不清楚了。但是这个证书是正规的,亲测有效,用了再说,省了一大笔麻烦。

    下面提供一些传送门:
    * 阿里云服务器配置证书教程:阿里云的文档简直是业界楷模
    * 阿里云证书购买(选择免费的那个) :选择免费的那个,看看其余的价格就是费用确实不低了
    * 阿里云配置苹果ATS帮助文档:很贴心地针对苹果的要求专门写了个服务器端的配置注意事项,其实从阿里云和腾讯云都退出了免费的证书来看,很好奇苹果的强力要求是不是对https的普及和平民化起到了一定的推动作用
    * 腾讯云检测ATS支持度:腾讯贴心地推出了一个供大家检测自家服务器配置后是否符合苹果要求的服务,哪里不足哪里满足都很详细,进一步加强了我上面的推测,这个对于证书的检测还算准,但是服务器那边的检测似乎对我用的阿里云服务器的配置非常不友好,我都亲测成功了依然显示不符合,存在故意诱导我使用腾讯云自家的证书的嫌疑,如下图:

    如果是使用这种方式,或者土豪地买正规证书,那服务器配完,工程url前面加个url就完事了,完美解决,浏览器会加上可爱的绿锁,iOS和Android都自动支持,不需要任何配置,省时省心,我也是配完后才发现其实可以不配。。。

    自生成证书

    但如果在如此大好的环境下还想用自生成的证书,那么除了服务器的配置要满足苹果的要求外(要求见上方阿里云的文档),工程内也需要做一些配置。

    首先,需要把证书放到工程内,必须是cer格式的,证书有多重格式,不同格式的转换见这个网站。是可以在mac的终端中直接输入命令行转换的。

    放到工程内后,去 info.plist 中增加如下图的配置:

    此外,还需要对网络请求部分的代码进行修改,因为要告诉它接受这个证书。这里,就要针对你使用的不同的网络请求方式有不同的设置了。

    NSURLConnection

    其实这个在iOS 9中已经废弃被NSURLSession取代了,不过还是说一下,直接添加下面的代理方法就可以了:

    - (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge{    if(challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust) {        // 告诉服务器,客户端信任证书
            // 创建凭据对象
            NSURLCredential *credntial = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];        // 告诉服务器信任证书
            [challenge.sender useCredential:credntial forAuthenticationChallenge:challenge];
        }
    }

    NSURLSession

    系统自带的类中现在就是推荐使用这个类,参考如下代码设置:

    - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task  didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * __nullable credential))completionHandler {
    
        // 判断是否是信任服务器证书
        if(challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust) {
            // 告诉服务器,客户端信任证书
            // 创建凭据对象
            NSURLCredential *credntial = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
            // 通过completionHandler告诉服务器信任证书
            completionHandler(NSURLSessionAuthChallengeUseCredential,credntial);
        }
        NSLog(@"protectionSpace = %@",challenge.protectionSpace);
    }

    AFNetworking 2.x版本

    随着iOS 9中对NSURLConnection的废弃, AFNetworking 3.0也做出了修改,不过还是有用2.新版本的,我们只用在原来使用AFHTTPRequestOperationManager类进行网络请求的基础上,改变它的安全策略并配置证书:

        AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    
        // https ================
        AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];// 证书模式
        NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"证书名字" ofType:@"cer"];
        NSData *cerData = [NSData dataWithContentsOfFile:cerPath];
        securityPolicy.pinnedCertificates = [[NSArray alloc] initWithObjects:cerData, nil];// 配置证书
        securityPolicy.allowInvalidCertificates = YES;// 客户端是否信任非法证书
        [securityPolicy setValidatesDomainName:NO];// 是否在证书域字段中验证域名
        manager.securityPolicy = securityPolicy;
        // ======================
    
        // 常规的进行POST、GET等请求操作
        // ...

    AFNetworking 3.x版本

    新的版本的里废弃了基于NSURLConnection封装的AFHTTPRequestOperationManager,转而使用基于NSURLSession封装的AFHTTPSessionManager了。

        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    
        // https ================
        AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];// 证书模式
        NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"证书名字" ofType:@"cer"];
        NSData *cerData = [NSData dataWithContentsOfFile:cerPath];
        securityPolicy.pinnedCertificates = [[NSArray alloc] initWithObjects:cerData, nil];// 配置证书
        securityPolicy.allowInvalidCertificates = YES;// 客户端是否信任非法证书
        [securityPolicy setValidatesDomainName:NO];// 是否在证书域字段中验证域名
        manager.securityPolicy = securityPolicy;
        // ======================
    
        // 常规的进行POST、GET等请求操作
        // ...

    以上,就是常用的网络请求方式下对自生成证书的配置了,如果用的是正规证书,配置了这些也不影响,不过其实已经可以自动识别了,强行配置了以后证书失效后还需要更改工程中的证书,到时候可能老版本就有问题了。

    结语

    现在,应该就可以应付苹果的要求了,而且App的网络请求时安全的了,对于一些数据敏感的应用或者涉及金额交易的应用应该会带来大大的安心,其实现在既然已经有免费的正规证书了,那么上一波HTTPS也是有百利而无一害的,真切感觉苹果的这一措施推动了其发展。

    除了自己对服务器的请求全上HTTPS以外,如果使用到了一些第三方的库或者服务,可能它们反而没有上,这时候就可能面临苹果审核出问题了,所以要进行说明是它们自己不上的我也没有办法,不过一般都会上吧。


    版权所有:http://blog.csdn.net/cloudox_

    展开全文
  • 我在前面两篇博客中《网络抓包工具Charles的介绍与使用》《iOS开发——使用Charles进行http网络抓包详解》对Charles的http抓包进行了详细的讲解。...(2)由于目前iOS9更改了对于https网络的安全机制,所以还需
  • Https iOS需要做的事

    2016-08-20 09:43:13
    Https iOS需要做的事情 HTTPS就是将HTTP协议数据包放到SSL/TSL层加密后,在TCP/IP层组成IP数据报去传输,以此保证传输数据的安全;而对于接收端,在SSL/TSL将接收的数据包解密之后,将数据传给HTTP协议层,就是普通...
  • 不使用AFNetworking的前提下, UIWebView默认不信任https协议的请求  - (void)viewDidLoad {  [super viewDidLoad];    [self.navigationController setNavigationBarHidden:YES animated:YES];  self.we
  • ios 9 出来以后,苹果推荐使用https协议,来提高数据传输之间的安全性苹果在2016年6月底发布说要在2017年强制开启ATS,但在24号说为了给用户时间去更新,延期了,但是无论如何早晚搜要使用HTTPS。下面将介绍,如何在工程...
  • 由于iOS10之后CoreData Stack的更改无法在iOS9的系统中运行,所以我们需要对上一小节中封装的工具类进行系统版本的兼容 iOS9iOS10中CoreData最本质的区别其实就是管理对象上下文iOS9中NSManagedObjectContext需要...
  • 最近一段时间在做推送,关于从自己app跳转到系统设置页面的方法可谓众说纷纭,以下针对不同的ios版本以及跳转到系统设置界面的不同层次做了总结(仅以推送为例):(注:本文ios9系统以ios9.3.1为依据;ios8系统以...
  • 转载 http://www.cocoachina.com/ios/20151016/13715.html =========================...本文主要是说一些iOS9适配中出现的坑,如果只是要单纯的了解iOS9新特性可以看瞄神的开发者所需要知道的 iOS 9 SDK 新特性。
  • iOS 启动页的设置

    2016-02-24 10:24:58
    1.ios启动页的设置,启动页时间的设置ios9上下出现黑边解决方法
  • iOS开发中,有时会有跳转系统设置界面的需求,例如提示用户打开蓝牙或者WIFI,提醒用户打开推送或者位置权限等。在iOS6之后,第三方应用需要跳转系统设置界面,需要在URL type中添加一个prefs值,如下图: 需要...
  • iOS http https小结

    2016-06-11 22:38:53
    http协议http协议超文本传输协议,用于规定客户端和...请求方法: iOS设置请求方法 NSURLRequest setHTTPMethod 请求统一资源定位符: 初始化的时候指定统一资源定位符的位置 NSURLRequest requestWithURL: cache
  • IOS 9 将删除Apps以节省空间供系统升级 IOS 9 beta 2早期的使用者发现了一个新功能,当没有足够空间安装系统升级时,系统会暂时删除过载设备上的Apps。据报道,许多使用较小内存8GB和16GB的iPhones的用户很难将最新...
  • 1.属性字符串的换行样式设置首行缩进后,计算属性字符串相应大小没有相应改变。 2.设置UIScrollView的属性contentOffset,容易导致崩溃。
  • IOS9 以后设置状态栏颜色无效解决方法 字数59 阅读119 评论0 喜欢0 在使用一般方法时,在IOS9以后,没有效果 [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]...
  • iPhone总是弹出一个提示窗口,如下图“iOS 9.3.2可用于您的iPhone且已经可以安装”,而窗口中根本就没有一个不想升级安装的选项。而当我们点击稍后,就会变成如下图所示的界面“输入密码以在今晚更新,如接入电源,...
  • iOS设置圆角的四种方法1. 设置CALayer的cornerRadius2. 设置CALayer的mask3. 通过Core Graphics重新绘制带圆角的视图4. 通过混合图层5. 总结 1. 设置CALayer的cornerRadius cornerRadius属性影响layer显示的...
1 2 3 4 5 ... 20
收藏数 122,631
精华内容 49,052
热门标签