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