您的当前位置:首页正文

iOS 9 HTTPS适配

来源:花图问答

配置如下:

添加完成之后还是出现上面的问题:

找了很多资料才发现还需要站点证书,上面请求失败可能是因为ssl第一次握手的时候验证没通过,然后就直接被取消了。所以这时候就需要获取站点的证书,获取的方法有两种:

1.通过openssl命令获取,命令如下(以百度为例):

这个命令的目的就是直接在你的终端打开的当前目录下面下载某一站点的证书,但是我怎么都获取不到下载的证书都是空的,而且终端还报错,找不到错误的原因,没办法只能用第二种办法了

获取到证书后把证书放到项目的mainbundle中,并用代码获取

这时候再跑起来,接口都能获取到数据了,成功了,不过到这里大家不知道会不会存在疑问,证书这么容易获取到,那别人获取了怎么办?就算用抓包工具拦截了请求里面的内容都是加密的,但是别人可以利用证书向我们服务器发请求的,是不是也存在点问题呢?这个问题我到现在还不是很明白,有的资料说这样获取的证书是公钥,没有私钥的话也是白费力气。

      App Transport Security(简称ATS)特性, 主要使到原来请求的时候用到的HTTP,都转向TLS1.2协议进行传输。这也意味着所有的HTTP协议都强制使用了HTTPS协议进行传输,ATS是在iOS 9.0 和 OS X v10.11版本中增加的特性,使用iOS 9.0或者OS X v10.11的SDK版本(或更新的SDK)进行编译应用时会默认启动ATS。则需要对ATS进行配置。如果使用iOS 9.0或者OS X v10.11之前的SDK版本编译的应用默认是禁止ATS的,因此不会影响应用的网络连接方面的功能(即使在iOS 9.0的机子上跑也是不影响的)。其实ATS并不单单针对HTTP进行了限制,对HTTPS也有一定的要求:

TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384

TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256

TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384

TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA

TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256

TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA

TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384

TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256

TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA

),文档中罗列出了支持的加密算法(上面的原文中有说明,我把它独立抽出来放到下面表格中查看)。最后就是证书至少要使用一个SHA256的指纹与任一个2048位或者更高位的RSA密钥,或者是256位或者更高位的ECC密钥。如果不符合其中一项,请求将被中断并返回nil,简单的说就是下面几个要求:

1.Transport Layer Security协议版本要求TLS1.2以上

2.服务的Ciphers配置要求支持Forward Secrecy等

3.证书签名算法符合ATS要求等

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

2.Mix & Match(混合)

2.1 在info.plist中添加这个配置项后,ATS当与这个子域交互的时候撤销了必须使用HTTPS的要求(以友盟为例)

3. Opt Out(禁用ATS)

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

当你的应用撤消了App Transport Security,,但同时定义了一些“例外”(Exception),指定了一个或多个“例外”(Exception)来表明哪些是必须要求 App Transport Security的。