
說明:文章中部分內容參考了網(wǎng)絡資源,如cocoaChina中的文章。
App Transport Security
iOS9中新增App Transport Security(簡稱ATS)特性, 主要使到原來請求的時候用到的HTTP,都轉向TLS1.2協(xié)議進行傳輸。這也意味著所有的HTTP協(xié)議都強制使用了HTTPS協(xié)議進行傳輸。在 iOS 9 和 OS X 10.11 中,默認情況下非 HTTPS 的網(wǎng)絡訪問是被禁止的。當然,因為這樣的推進影響面非常廣,作為緩沖,我們可以在 Info.plist 中添加 NSAppTransportSecurity字典并且將 NSAllowsArbitraryLoads設置為 YES來禁用 ATS。
不過,WWDC 16 中,Apple 表示將繼續(xù)在 iOS 10 和 macOS 10.12 里收緊對普通 HTTP 的訪問限制。從 2017 年 1 月 1 日起,所有的新提交 app 默認ATS Configuration Basics / ATS 配置基礎知識是不允許使用 NSAllowsArbitraryLoads來繞過 ATS 限制的,也就是說,我們最好保證 app 的所有網(wǎng)絡請求都是 HTTPS 加密的,否則可能會在應用審核時遇到麻煩
最新的消息是蘋果迫于壓力,已經(jīng)延遲了必須ATS的限制,不過這事情早晚要做的,還是盡快搞好
ATS 配置基礎知識
對于使用 iOS9.0, OS X v10.11 SDK 及以上的 app 來說,ATS(App Transport Security)默認開啟,NSAllowsArbitraryLoads是字典NSAppTransportSecurity的根鍵,默認值NO。
在啟用 ATS 的情況下,所有的 HTTP 請求必須為 HTTPS(RFC 2818) 連接。任何不安全的 HTTP 請求都將失敗。ATS 使用 TLS(Transport Layer Security)v1.2(RFC 5246)。
字典NSAppTransportSecurity的總體結構
NSAppTransportSecurity : Dictionary {? ? ?
NSAllowsArbitraryLoads : Boolean? ? ?
NSAllowsArbitraryLoadsInMedia : Boolean? ? ?
NSAllowsArbitraryLoadsInWebContent : Boolean? ? ?
NSAllowsLocalNetworking : Boolean? ? ?
NSExceptionDomains : Dictionary {
<domain-name-string>: Dictionary {
NSIncludesSubdomains : Boolean
NSExceptionAllowsInsecureHTTPLoads : Boolean
NSExceptionMinimumTLSVersion : String
NSExceptionRequiresForwardSecrecy : Boolean ? // Default value is YES
NSRequiresCertificateTransparency : Boolean
}}}
所有鍵可以分為兩類:主鍵,這些鍵用來定義 app 的總體 ATS 策略;子鍵,即NSExceptionDomains下面的鍵,使用這些鍵針對某個域名單獨配置。
主鍵包括:
NSAllowsArbitraryLoads
設置為 YES,解除整個 app 的 ATS 限制;但是,通過-NSExceptionDomains進 行的配置依然有效。默認值為 NO。
注意:設置為 YES,會引發(fā) App Stroe 的審查,開發(fā)者必須說明原因。
NSAllowsArbitraryLoadsInMedia
設置為 YES,解除通過 AV Foundation 框架訪問媒體內容時的 ATS 限制;啟用這個 鍵,務必確保載入的媒體內容已經(jīng)被加密,例如受FairPlay保護的文件,或者是安全的 HLS流媒,其中不包含敏感的個人信息。默認為 NO。
NSAllowsArbitraryLoadsInWebContent
設置為 YES,解除通過 web view 發(fā)出的網(wǎng)絡請求的 ATS 限制。啟用這個鍵,可以使 app 訪問任意網(wǎng)頁內容,但不影響 app 的總體 ATS 策略。此鍵值默認為 NO。
NSAllowsLocalNetworking
設置為 YES,使得 app 可以載入任意本地資源,但不影響 app 的總體 ATS 策略。默 認為 NO。
NSExceptionDomains
為一個或多個域名單獨配置 ATS。
被單獨配置的域名,默認受到完全的 ATS 限制,不管NSAllowsArbitraryLoads的值 如何;需要通過子鍵,進一步配置
所有的子鍵都屬于NSExceptionDomain。向Info.plist中添加這一主鍵:
創(chuàng)建字典,針對一個或多個域名,以便進行 ATS 配置。
這意味著之前使用主鍵所做的設置,對于這個域名來說,已經(jīng)無效。
例如,及時之前設置NSAllowsArbitraryLoadsInMedia為 YES,然而NSExceptionDomain所代表的域名依然不能訪問不安全的媒體內容。
基于這樣的設定,可以針對域名進行 ATS 配置,增加或減少安全措施。例如:
將NSExceptionAllowsInsecureHTTPLoads設置為 YES,就 ;這樣做會引發(fā) App Store 的審查,詳情見App Store Review for ATS。
通過配置NSExceptionRequiresForwardSecrecy為 NO,取消正向保密。
通過配置NSExceptionMinimumTLSVersion,更改 TLS 最低版本
NSExceptionDomains字典構成:
<域名字符串>代表想要配置的特定域名??梢蕴砑佣鄠€域名(即添加多個這樣的鍵),為它們統(tǒng)一配置 ATS 策略。這個鍵對應一個字典,包含以下子鍵:
NSIncludesSubdomains 設置為 YES,當前域名的 ATS 策略適用于其所有子域名。默認為 NO。
NSExceptionAllowsInsecureHTTPLoads 設置為 YES,可以同時通過 HTTP 和 HTTPS 訪問當前域名。默認為 NO。注意,配置這個鍵值,將引發(fā) App Store 的審查,開發(fā)者必須說明原因。
NSExceptionMinimumTLSVersion* 指定 TLS 的最低版本,因此可以使用版本較低,有安全漏洞的 TLS 協(xié)議。注意,配置這個鍵值,將引發(fā) App Store 的審查,開發(fā)者必須說明原因。
NSExceptionRequiresForwardSecrecy* 設置為 NO,允許針對當前域名使用不支持正向保密的 TLS 加密算法。默認為 YES。
NSRequiresCertificateTransparency* 設置為 YES,將驗證域名服務器證書的Certificate Transparency時間戳 。默認為 NO。
使用 ATS 的前提條件
在 ATS 完全開啟的情況下,系統(tǒng)要求 app 的 HTTPS 連接必須滿足以下要求:
X.509 數(shù)字證書必須滿足下列標準中的一項:
由操作系統(tǒng)內嵌的根證書頒發(fā)機構簽發(fā)
由通過操作系統(tǒng)管理員或用戶主動安裝的根證書頒發(fā)機構簽發(fā)TLS 版本必須為1.2,任何不使用或使用較低版本 TLS / SSL 的連接,都將失敗。
連接必須使用 AES-128 或 AES-256 對稱加密算法。 TLS 算法套裝必須以 ECDSA 密鑰交換的形式支持正向保密,加密算法必須為下面之一:
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
服務端的葉證書簽名密鑰必須為下面之一:
至少2048位的 RSA 密鑰
至少256位的 ECC 密鑰
此外,服務器證書的哈希算法必須為 SHA-2,其摘要長度至少位256位(即 SHA-256 及以上)。上面的標準,未來可能會發(fā)生變化。但不會影響到 app 二進制包的兼容性。
App Store 對于 ATS 相關項的審核
某些對 ATS 的配置會引發(fā) App Store 的審核,開發(fā)者必須說明原因。這些鍵有:
NSAllowsArbitraryLoads
NSExceptionAllowsInsecureHTTPLoads
NSExceptionMinimumTLSVersion
以下是一些原因說明例子,供參考:
必須連接由其他機構控制的服務器,其還不支持安全連接。
必須支持那些還未升級至可使用安全連接,不得不通過公共域名訪問網(wǎng)絡的設備。
必須通過 web 展示來源不一的各種網(wǎng)絡內容,但又不能完全使用NSAllowsArbitraryLoadsInWebContent所管理的類。
向 App Store 提交審核時,開發(fā)者應主動提供足夠的信息,以便解釋 app 無法使用安全連接的原因
實現(xiàn)支持安全ATS策略
app內服務器網(wǎng)絡請求訪問支持https解決方案:
搭建https服務器,搭建https服務器需要ssl證書:
HTTPS服務器滿足ATS默認的條件,而且SSL證書是通過權威的CA機構認證過的,那么我們在使用Xcode開發(fā)的時候,對網(wǎng)絡的適配什么都不用做,我們也能正常與服務器通信。
第三方sdk接入與支持http訪問:
主要是圍繞info.pilst配置文件作相關的安全ATS策略
NSExceptionDomains 的設置方法如下, 比如我們要將 第三方 域名排除在 ATS 驗證之外,就可以這樣:

結束,謝謝點擊~~~
