iOS適配ATS支持Https過(guò)AppStore審核


思維導(dǎo)圖

說(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)證之外悬蔽,就可以這樣:

info.plist ATS設(shè)置

結(jié)束扯躺,謝謝點(diǎn)擊~~~


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蝎困,隨后出現(xiàn)的幾起案子录语,更是在濱河造成了極大的恐慌,老刑警劉巖禾乘,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件澎埠,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡盖袭,警方通過(guò)查閱死者的電腦和手機(jī)失暂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)彼宠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人弟塞,你說(shuō)我怎么就攤上這事凭峡。” “怎么了决记?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵摧冀,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我系宫,道長(zhǎng)索昂,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任扩借,我火速辦了婚禮椒惨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘潮罪。我一直安慰自己康谆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布嫉到。 她就那樣靜靜地躺著沃暗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪何恶。 梳的紋絲不亂的頭發(fā)上孽锥,一...
    開(kāi)封第一講書(shū)人閱讀 51,182評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音细层,去河邊找鬼惜辑。 笑死,一個(gè)胖子當(dāng)著我的面吹牛今艺,可吹牛的內(nèi)容都是我干的韵丑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼虚缎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了钓株?” 一聲冷哼從身側(cè)響起实牡,我...
    開(kāi)封第一講書(shū)人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎轴合,沒(méi)想到半個(gè)月后创坞,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡受葛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年题涨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了偎谁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡纲堵,死狀恐怖巡雨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情席函,我是刑警寧澤铐望,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站茂附,受9級(jí)特大地震影響正蛙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜营曼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一乒验、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蒂阱,春花似錦锻全、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至辐赞,卻和暖如春部翘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背响委。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工新思, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赘风。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓夹囚,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親邀窃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子荸哟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容