說(shuō)明:文章中部分內(nèi)容參考了網(wǎng)絡(luò)資源剿配,如cocoaChina中的文章鬓椭。
App Transport Security
iOS9中新增App Transport Security(簡(jiǎn)稱(chēng)ATS)特性, 主要使到原來(lái)請(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ò)訪問(wèn)是被禁止的。當(dāng)然动分,因?yàn)檫@樣的推進(jìn)影響面非常廣毅糟,作為緩沖,我們可以在 Info.plist 中添加 NSAppTransportSecurity字典并且將 NSAllowsArbitraryLoads設(shè)置為 YES來(lái)禁用 ATS刺啦。
不過(guò)留特,WWDC 16 中纠脾,Apple 表示將繼續(xù)在 iOS 10 和 macOS 10.12 里收緊對(duì)普通 HTTP 的訪問(wèn)限制玛瘸。從 2017 年 1 月 1 日起,所有的新提交 app 默認(rèn)ATS Configuration Basics / ATS 配置基礎(chǔ)知識(shí)是不允許使用 NSAllowsArbitraryLoads來(lái)繞過(guò) ATS 限制的苟蹈,也就是說(shuō)糊渊,我們最好保證 app 的所有網(wǎng)絡(luò)請(qǐng)求都是 HTTPS 加密的,否則可能會(huì)在應(yīng)用審核時(shí)遇到麻煩
最新的消息是蘋(píng)果迫于壓力慧脱,已經(jīng)延遲了必須ATS的限制渺绒,不過(guò)這事情早晚要做的,還是盡快搞好
ATS 配置基礎(chǔ)知識(shí)
對(duì)于使用 iOS9.0菱鸥, OS X v10.11 SDK 及以上的 app 來(lái)說(shuō)宗兼,ATS(App Transport Security)默認(rèn)開(kāi)啟,NSAllowsArbitraryLoads是字典N(xiāo)SAppTransportSecurity的根鍵氮采,默認(rèn)值NO殷绍。
在啟用 ATS 的情況下,所有的 HTTP 請(qǐng)求必須為 HTTPS(RFC 2818) 連接鹊漠。任何不安全的 HTTP 請(qǐng)求都將失敗主到。ATS 使用 TLS(Transport Layer Security)v1.2(RFC 5246)。
字典N(xiāo)SAppTransportSecurity的總體結(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
}}}
所有鍵可以分為兩類(lèi):主鍵躯概,這些鍵用來(lái)定義 app 的總體 ATS 策略登钥;子鍵,即NSExceptionDomains下面的鍵娶靡,使用這些鍵針對(duì)某個(gè)域名單獨(dú)配置牧牢。
主鍵包括:
NSAllowsArbitraryLoads
設(shè)置為 YES,解除整個(gè) app 的 ATS 限制;但是塔鳍,通過(guò)-NSExceptionDomains進(jìn) 行的配置依然有效度陆。默認(rèn)值為 NO。
注意:設(shè)置為 YES献幔,會(huì)引發(fā) App Stroe 的審查懂傀,開(kāi)發(fā)者必須說(shuō)明原因。
NSAllowsArbitraryLoadsInMedia
設(shè)置為 YES蜡感,解除通過(guò) AV Foundation 框架訪問(wèn)媒體內(nèi)容時(shí)的 ATS 限制蹬蚁;啟用這個(gè) 鍵,務(wù)必確保載入的媒體內(nèi)容已經(jīng)被加密郑兴,例如受FairPlay保護(hù)的文件犀斋,或者是安全的 HLS流媒,其中不包含敏感的個(gè)人信息情连。默認(rèn)為 NO叽粹。
NSAllowsArbitraryLoadsInWebContent
設(shè)置為 YES,解除通過(guò) web view 發(fā)出的網(wǎng)絡(luò)請(qǐng)求的 ATS 限制却舀。啟用這個(gè)鍵虫几,可以使 app 訪問(wèn)任意網(wǎng)頁(yè)內(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的值 如何袭艺;需要通過(guò)子鍵搀崭,進(jìn)一步配置
所有的子鍵都屬于NSExceptionDomain。向Info.plist中添加這一主鍵:
創(chuàng)建字典匹表,針對(duì)一個(gè)或多個(gè)域名门坷,以便進(jìn)行 ATS 配置。
這意味著之前使用主鍵所做的設(shè)置袍镀,對(duì)于這個(gè)域名來(lái)說(shuō)默蚌,已經(jīng)無(wú)效。
例如苇羡,及時(shí)之前設(shè)置NSAllowsArbitraryLoadsInMedia為 YES绸吸,然而NSExceptionDomain所代表的域名依然不能訪問(wèn)不安全的媒體內(nèi)容。
基于這樣的設(shè)定,可以針對(duì)域名進(jìn)行 ATS 配置锦茁,增加或減少安全措施攘轩。例如:
將NSExceptionAllowsInsecureHTTPLoads設(shè)置為 YES,就 码俩;這樣做會(huì)引發(fā) App Store 的審查度帮,詳情見(jiàn)App Store Review for ATS。
通過(guò)配置NSExceptionRequiresForwardSecrecy為 NO稿存,取消正向保密笨篷。
通過(guò)配置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í)通過(guò) HTTP 和 HTTPS 訪問(wèn)當(dāng)前域名脯宿。默認(rèn)為 NO念颈。注意,配置這個(gè)鍵值连霉,將引發(fā) App Store 的審查,開(kāi)發(fā)者必須說(shuō)明原因嗡靡。
NSExceptionMinimumTLSVersion* 指定 TLS 的最低版本跺撼,因此可以使用版本較低,有安全漏洞的 TLS 協(xié)議讨彼。注意歉井,配置這個(gè)鍵值,將引發(fā) App Store 的審查哈误,開(kāi)發(fā)者必須說(shuō)明原因哩至。
NSExceptionRequiresForwardSecrecy* 設(shè)置為 NO,允許針對(duì)當(dāng)前域名使用不支持正向保密的 TLS 加密算法蜜自。默認(rèn)為 YES菩貌。
NSRequiresCertificateTransparency* 設(shè)置為 YES,將驗(yàn)證域名服務(wù)器證書(shū)的Certificate Transparency時(shí)間戳 重荠。默認(rèn)為 NO箭阶。
使用 ATS 的前提條件
在 ATS 完全開(kāi)啟的情況下,系統(tǒng)要求 app 的 HTTPS 連接必須滿(mǎn)足以下要求:
X.509 數(shù)字證書(shū)必須滿(mǎn)足下列標(biāo)準(zhǔn)中的一項(xiàng):
由操作系統(tǒng)內(nèi)嵌的根證書(shū)頒發(fā)機(jī)構(gòu)簽發(fā)
由通過(guò)操作系統(tǒng)管理員或用戶(hù)主動(dòng)安裝的根證書(shū)頒發(fā)機(jī)構(gòu)簽發(fā)TLS 版本必須為1.2,任何不使用或使用較低版本 TLS / SSL 的連接仇参,都將失敗嘹叫。
連接必須使用 AES-128 或 AES-256 對(duì)稱(chēng)加密算法。 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ù)端的葉證書(shū)簽名密鑰必須為下面之一:
至少2048位的 RSA 密鑰
至少256位的 ECC 密鑰
此外罩扇,服務(wù)器證書(shū)的哈希算法必須為 SHA-2,其摘要長(zhǎng)度至少位256位(即 SHA-256 及以上)怕磨。上面的標(biāo)準(zhǔn)暮蹂,未來(lái)可能會(huì)發(fā)生變化。但不會(huì)影響到 app 二進(jìn)制包的兼容性癌压。
App Store 對(duì)于 ATS 相關(guān)項(xiàng)的審核
某些對(duì) ATS 的配置會(huì)引發(fā) App Store 的審核仰泻,開(kāi)發(fā)者必須說(shuō)明原因。這些鍵有:
NSAllowsArbitraryLoads
NSExceptionAllowsInsecureHTTPLoads
NSExceptionMinimumTLSVersion
以下是一些原因說(shuō)明例子滩届,供參考:
必須連接由其他機(jī)構(gòu)控制的服務(wù)器集侯,其還不支持安全連接。
必須支持那些還未升級(jí)至可使用安全連接帜消,不得不通過(guò)公共域名訪問(wèn)網(wǎng)絡(luò)的設(shè)備棠枉。
必須通過(guò) web 展示來(lái)源不一的各種網(wǎng)絡(luò)內(nèi)容,但又不能完全使用NSAllowsArbitraryLoadsInWebContent所管理的類(lèi)泡挺。
向 App Store 提交審核時(shí)辈讶,開(kāi)發(fā)者應(yīng)主動(dòng)提供足夠的信息,以便解釋 app 無(wú)法使用安全連接的原因
實(shí)現(xiàn)支持安全ATS策略
app內(nèi)服務(wù)器網(wǎng)絡(luò)請(qǐng)求訪問(wèn)支持https解決方案:
搭建https服務(wù)器娄猫,搭建https服務(wù)器需要ssl證書(shū):
HTTPS服務(wù)器滿(mǎn)足ATS默認(rèn)的條件贱除,而且SSL證書(shū)是通過(guò)權(quán)威的CA機(jī)構(gòu)認(rèn)證過(guò)的,那么我們?cè)谑褂肵code開(kāi)發(fā)的時(shí)候媳溺,對(duì)網(wǎng)絡(luò)的適配什么都不用做月幌,我們也能正常與服務(wù)器通信。
第三方sdk接入與支持http訪問(wèn):
主要是圍繞info.pilst配置文件作相關(guān)的安全ATS策略
NSExceptionDomains 的設(shè)置方法如下, 比如我們要將 第三方 域名排除在 ATS 驗(yàn)證之外悬蔽,就可以這樣:
結(jié)束扯躺,謝謝點(diǎn)擊~~~