蘋果文檔翻譯 iOS10 NSAppTransportSecurity
- 原文鏈接
- 原文版本:2016-09-07
- 翻譯時(shí)間:2016-09-07
本文截取自蘋果官方文檔 Information Property List Key Reference ---> Cocoa Keys ---> NSAppTransportSecurity
NSAppTransportSecurity(對(duì)應(yīng)的值為字典類型)被用來(lái)定義 app 在進(jìn)行網(wǎng)絡(luò)請(qǐng)求時(shí)的安全設(shè)定:為現(xiàn)有安全機(jī)制設(shè)定特例,或者開啟新的安全特性。
在蘋果的開發(fā)平臺(tái)上,有一種被稱為App Transport Security(ATS)的網(wǎng)絡(luò)安全機(jī)制,適用于 app 以及 app extension,默認(rèn)開啟。這項(xiàng)機(jī)制確保 app 在進(jìn)行網(wǎng)絡(luò)訪問(wèn)時(shí),使用業(yè)界標(biāo)準(zhǔn)的,沒(méi)有已知重大安全隱患的協(xié)議和加密方式,以此確保用戶的隱私和數(shù)據(jù)完整性。從而培養(yǎng)用戶對(duì)您的 app 的信任。
通過(guò)在info.plist中配置這個(gè)鍵,開發(fā)者可以自定義網(wǎng)絡(luò)安全策略。例如:
- 允許針對(duì)個(gè)別服務(wù)器的不安全訪問(wèn)。
- 允許不安全的 web 或媒體內(nèi)容訪問(wèn),但不影響整個(gè) app 的 ATS 策略。
- 啟用新的安全特性,例如
Certificate Transparency。
對(duì)NSAppTransportSecurity的支持自 iOS9.0,OS X v10.11 開始,適用于 app 和 app extension。
自 iOS10.0,macOS 10.12 開始,增加了對(duì)下列子鍵的支持:
- NSAllowsArbitraryLoadsInMedia
- NSAllowsArbitraryLoadsInWebContent
- NSRequiresCertificateTransparency
- NSAllowsLocalNetworking
目錄
- ATS Configuration Basics / ATS 配置基礎(chǔ)知識(shí)
- Using ATS in Apple Frameworks / 在 Apple 框架中使用 ATS
- Availability of ATS for Remote and Local Connections / 本地 & 遠(yuǎn)程連接與 ATS
- Requirements for Connecting Using ATS / 使用 ATS 的前提條件
- Certificate Transparency
- ATS and Overriding HTTPS Server Trust Evaluation / ATS 與改寫服務(wù)端信任評(píng)估規(guī)則
- App Store Review for ATS / App Store 對(duì)于 ATS 相關(guān)項(xiàng)的審核
- ATS Dictionary Details / ATS 字典詳細(xì)信息
- ATS Examples / ATS 配置實(shí)例
- Debugging ATS Connections / ATS Debugging 相關(guān)
- Using the nscurl Tool to Diagnose ATS Connection Issues / 使用 nscurl 工具診斷 ATS 相關(guān)問(wèn)題
ATS Configuration Basics / ATS 配置基礎(chǔ)知識(shí)
對(duì)于使用 iOS9.0, OS X v10.11 SDK 及以上的 app 來(lái)說(shuō),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)。更多關(guān)于安全連接的信息,請(qǐng)查閱HTTPS Server Trust Evaluation。
下面是字典NSAppTransportSecurity的總體結(jié)構(gòu),所有鍵都是非必填項(xiàng):
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)定義 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 的審查,開發(fā)者必須說(shuō)明原因。
- 設(shè)置為 YES,解除整個(gè) app 的 ATS 限制;但是,通過(guò)
-
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。
- 設(shè)置為 YES,解除通過(guò) AV Foundation 框架訪問(wèn)媒體內(nèi)容時(shí)的 ATS 限制;啟用這個(gè)鍵,務(wù)必確保載入的媒體內(nèi)容已經(jīng)被加密,例如受
-
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)一步配置。
閱讀表2,獲取關(guān)于上述主鍵的詳細(xì)信息。
所有的子鍵都屬于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 的審查,詳情見App Store Review for ATS。 - 通過(guò)配置
NSExceptionRequiresForwardSecrecy為 NO,取消正向保密。 - 通過(guò)配置
NSExceptionMinimumTLSVersion,更改 TLS 最低版本。
還參考Certificate Transparency,保證訪問(wèn)特定域名時(shí)的安全,詳情見Certificate Transparency。
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 的審查,開發(fā)者必須說(shuō)明原因。
- NSExceptionMinimumTLSVersion
- 指定 TLS 的最低版本,因此可以使用版本較低,有安全漏洞的 TLS 協(xié)議。
- 注意,配置這個(gè)鍵值,將引發(fā) App Store 的審查,開發(fā)者必須說(shuō)明原因。
- NSExceptionRequiresForwardSecrecy
- 設(shè)置為 NO,允許針對(duì)當(dāng)前域名使用不支持正向保密的 TLS 加密算法。默認(rèn)為 YES。
- NSRequiresCertificateTransparency
- 設(shè)置為 YES,將驗(yàn)證域名服務(wù)器證書的
Certificate Transparency時(shí)間戳 。默認(rèn)為 NO。
- 設(shè)置為 YES,將驗(yàn)證域名服務(wù)器證書的
- NSIncludesSubdomains
- 代表想要配置的特定域名??梢蕴砑佣鄠€(gè)域名(即添加多個(gè)這樣的鍵),為它們統(tǒng)一配置 ATS 策略。這個(gè)鍵對(duì)應(yīng)一個(gè)字典,包含以下子鍵:
閱讀表3,獲取關(guān)于NSExceptionDomains的進(jìn)一步詳細(xì)信息。
Using ATS in Apple Frameworks / 在 Apple 框架中使用 ATS
NSURLSession 以及所有與其相關(guān)的 API 都實(shí)現(xiàn)了對(duì) ATS 的支持;如果您的 app 基于 iOS9.0 SDK 或 OS X v10.11 SDK 以上版本開發(fā),ATS 自動(dòng)開啟。(較老的 NSURLConnection 同樣會(huì)在上述 SDK 中開啟對(duì) ATS 的支持。)然而,在使用底層網(wǎng)絡(luò) API 或第三方網(wǎng)絡(luò)庫(kù)時(shí),無(wú)法受到 ATS 的保護(hù)。
**注意**:使用底層 API 或第三方網(wǎng)絡(luò)庫(kù)時(shí),請(qǐng)仔細(xì)考量風(fēng)險(xiǎn)因素。
iOS9.0 或 OS X v10.11 以下版本,不支持 ATS,NSAppTransportSecurity會(huì)被操作系統(tǒng)忽略。當(dāng) ATS 不可用時(shí),系統(tǒng)將根據(jù)RFC 2818提供標(biāo)準(zhǔn)的 HTTPS 安全策略,對(duì)服務(wù)端進(jìn)行驗(yàn)證。
當(dāng)您的 app 運(yùn)行在 iOS9.0 或者 OS X v10.11以下時(shí),網(wǎng)絡(luò)連接仍然可用,但 ATS 不起作用。
Availability of ATS for Remote and Local Connections / 本地 & 遠(yuǎn)程與 ATS
ATS 只針對(duì)公共域名起效。ATS 對(duì)已下連接無(wú)效:
- IP 地址
- 非法域名
- 使用
.local作為頂級(jí)域名的本地主機(jī)
為了連接非法域名或本地域名,需要將NSAllowsLocalNetworking設(shè)置為 YES。
**注意**:雖然本地連接并不強(qiáng)制使用 ATS,但 Apple 強(qiáng)烈推薦開發(fā)者通過(guò)TLS + 自簽名證書的方式訪問(wèn)本地連接。
Requirements for Connecting Using ATS / 使用 ATS 的前提條件
在 ATS 完全開啟的情況下,系統(tǒng)要求 app 的 HTTPS 連接必須滿足以下要求:
-
X.509 數(shù)字證書必須滿足下列標(biāo)準(zhǔn)中的一項(xiàng):
- 由操作系統(tǒng)內(nèi)嵌的根證書頒發(fā)機(jī)構(gòu)簽發(fā)
- 由通過(guò)操作系統(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),未來(lái)可能會(huì)發(fā)生變化。但不會(huì)影響到 app 二進(jìn)制包的兼容性。
Certificate Transparency
暫略
ATS and Overriding HTTPS Server Trust Evaluation / ATS 和 改寫服務(wù)器授信校驗(yàn)規(guī)則
能否自行改寫服務(wù)器授信校驗(yàn)規(guī)則,取決于 ATS 是否針對(duì)某個(gè)域名開啟。解釋如下:
- 如果 ATS 針對(duì)域名開啟,無(wú)法改寫。
- 如果 ATS 未針對(duì)域名開啟,系統(tǒng)將按照默認(rèn)規(guī)則進(jìn)行授信校驗(yàn),可以改寫。
App Store Review for ATS / App Store 對(duì)于 ATS 相關(guān)項(xiàng)的審核
某些對(duì) ATS 的配置會(huì)引發(fā) App Store 的審核,開發(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所管理的類。
向 App Store 提交審核時(shí),開發(fā)者應(yīng)主動(dòng)提供足夠的信息,以便解釋 app 無(wú)法使用安全連接的原因。
ATS Dictionary Details / ATS 字典詳細(xì)信息
表2列出了NSAppTransportSecurity字典所有主鍵信息,通過(guò)定義這些主鍵,開發(fā)者可以配置 app 的網(wǎng)絡(luò)行為。同NSExceptionDomains相關(guān)的子鍵信息請(qǐng)查看表3。
表2 ATS 字典主鍵
| 鍵名 | Xcode 描述名 |
類型 | 描述 |
|---|---|---|---|
| NSAllowsArbitraryLoads | “Allow Arbitrary Loads” | Boolean | 非必填項(xiàng),設(shè)置為 YES,關(guān)閉 ATS,通過(guò)NSExceptionDomains配置的域名除外。使用這個(gè)鍵將引發(fā) App Store 的審核,開發(fā)者必須說(shuō)明原因。 這個(gè)鍵有助于開發(fā)和 debug。 iOS10 或 macOS 10.12 以上系統(tǒng)中,如果下列鍵出現(xiàn)在 info.plist中,這個(gè)鍵的值將被忽略:<li> NSAllowsArbitraryLoadsForMediaContent<li> NSAllowsArbitraryLoadsInWebContent<li> NSAllowsLocalNetworking注意,關(guān)閉 ATS, 所有的網(wǎng)絡(luò)連接(HTTP / HTTPS)不再受到限制;可以使用低版本的 TLS 協(xié)議;可以使用不支持正向保密的加密算法。 默認(rèn)值為 NO,表示對(duì)所有連接采用默認(rèn)的 ATS 策略,通過(guò) NSExceptionDomains進(jìn)行配置的域名除外。 |
| NSAllowsArbitraryLoadsInMedia | 無(wú) | Boolean | 非必填項(xiàng),設(shè)置為 YES ,關(guān)閉對(duì)于通過(guò) AV Foundation 框架訪問(wèn)的媒體內(nèi)容的 ATS 限制,詳情見AV Foundation Framework Reference。 僅在媒體內(nèi)容已經(jīng)被加密,如受到 FairPlay 保護(hù);或者播放安全的 HLS 流媒體;并且不包含個(gè)人信息時(shí)啟用這個(gè)鍵。 如果 info.plist 包含這個(gè)鍵,不管它的值是什么,ATS 都將忽略 NSAllowsArbitraryLoads的值。這個(gè)鍵的默認(rèn)值為 NO。 iOS10.0 和 macOS 10.12 及以上可用。 |
| NSAllowsArbitraryLoadsInWebContent | 無(wú) | Boolean | 非必填項(xiàng),只針對(duì)下列類有效:<li>WKWebView<li>UIWebView(iOS)<li>WebView(macOS) 當(dāng)設(shè)置為 YES 時(shí),app 的 web 視圖進(jìn)行內(nèi)容訪問(wèn)時(shí)可以不受 ATS 限制,同時(shí)不影響其他諸如 NSURLSession的安全策略。默認(rèn)值為 NO。 為了支持舊版本的 iOS 和 OS X,可以使用這鍵的同時(shí),手動(dòng)配置 ATS:將這個(gè)鍵的值設(shè)置為 YES,同時(shí)配置 NSAllowsArbitraryLoads子鍵。如果 info.plist 包含這個(gè)鍵,不論其值如何, NSAllowsArbitraryLoads的值將被忽略。iOS10.0 和 macOS 10.12 及以上可用。 |
| NSAllowsLocalNetworking | 無(wú) | Boolean | 非必填項(xiàng),設(shè)置為 YES,移除所有針對(duì)非法域名和.local開頭的域名的 ATS 限制,對(duì)于其他域名沒(méi)有影響。如果設(shè)置為 YES, NSAllowsArbitraryLoads的值將被忽略(iOS10.0 和 macOS 10.12以后)。這種設(shè)定使得 app 的內(nèi)置本地瀏覽器在以前的版本仍舊正常工作,同時(shí)在新的版本獲得完整的 ATS 保護(hù)。(設(shè)置方法:將這個(gè)鍵設(shè)置為 YES,并且將NSAllowsArbitraryLoads也設(shè)置為 YES)。默認(rèn)值為 NO。 iOS10.0 和 macOS 10.12 及以上可用。 |
| NSExceptionDomains | “Exception Domains” | Boolean | 非必填項(xiàng),針對(duì)某個(gè)域名單獨(dú)配置 ATS 策略。這個(gè)字典中的每個(gè)鍵都對(duì)應(yīng)一個(gè)字典,用來(lái)描述針對(duì)特定域名的網(wǎng)絡(luò)安全策略。 最上層的鍵是域名字符串;例如,www.apple.com,其必須符合以下規(guī)范:<li>全部小寫<li>不能包含端口號(hào)<li>不能是數(shù)字表示的 IP 地址 <li>不能以 .結(jié)尾,除非開發(fā)者確定要這樣做。例如,example.com.對(duì)應(yīng)"example.com."(末尾有點(diǎn)),而非example.com。類似的,example.com對(duì)應(yīng)"example.com"(末尾無(wú)點(diǎn)),而非example.com.。更多關(guān)于此字典的信息,參加表3。 |
表3列舉了用來(lái)針對(duì)某個(gè)域名進(jìn)行網(wǎng)絡(luò)安全配置所使用的鍵。
表3 針對(duì)某個(gè)域名進(jìn)行網(wǎng)絡(luò)安全配置的子鍵
| 鍵名 | Xcode 描述名 |
類型 | 描述 |
|---|---|---|---|
| NSIncludesSubdomains | 無(wú) | Boolean | 非必填項(xiàng),設(shè)置為 YES,當(dāng)前域名的 ATS 策略適用于其所有子域名。 默認(rèn)值為 NO。 |
| NSRequiresCertificateTransparency | 無(wú) | Boolean | 非必填項(xiàng),設(shè)置為 YES,將驗(yàn)證域名服務(wù)器證書的Certificate Transparency時(shí)間戳。默認(rèn)值為 NO。 iOS10.0 和 macOS 10.12 及以上可用。 |
| NSExceptionAllowsInsecureHTTPLoads | 無(wú) | Boolean | 非必填項(xiàng),設(shè)置為 YES,將允許不安全的網(wǎng)絡(luò)連接,但不改變 TLS 策略。如果確定域名足夠安全,可以使用這個(gè)鍵。 使用這個(gè)鍵將引發(fā) App Store 的審核,開發(fā)者必須說(shuō)明原因。 設(shè)置為 YES,app 可以針對(duì)當(dāng)前域名同時(shí)使用 HTTP 連接和 HTTPS 連接;不安全的訪問(wèn)形式包括:證書缺失,自簽名,過(guò)期,證書不符等。 可能需要啟用這個(gè)鍵的情形:<li>需要通過(guò)不安全的連接訪問(wèn)當(dāng)前域名<li>訪問(wèn)無(wú)法進(jìn)行授信校驗(yàn)的服務(wù)器<li>訪問(wèn) HTTPS 服務(wù)器,但需要改寫服務(wù)器授信校驗(yàn)規(guī)則 有時(shí),這個(gè)鍵需要配合其他鍵使用。例如,需要安全連接一個(gè)自簽名服務(wù)器,或者服務(wù)器 TLS 版本低于1.2,這時(shí),將 NSExceptionAllowsInsecureHTTPLoads設(shè)置為 YES,然后將NSExceptionMinimumTLSVersion設(shè)置為合適的值即可。默認(rèn)值為 NO。 |
| NSExceptionRequiresForwardSecrecy | 無(wú) | Boolean | 非必填項(xiàng),用來(lái)表示是否要求服務(wù)器支持正向保密。如果確定域名足夠安全,可以使用這個(gè)鍵。 默認(rèn)值為 YES,即將符合要求的加密算法限制在ATS Configuration Basics中。 設(shè)置為 NO,則可以接受以下加密算法形式:<li>TLS_RSA_WITH_AES_256_GCM_SHA384<li>TLS_RSA_WITH_AES_128_GCM_SHA256<li>TLS_RSA_WITH_AES_256_CBC_SHA256<li>TLS_RSA_WITH_AES_256_CBC_SHA<li>TLS_RSA_WITH_AES_128_CBC_SHA256<li>TLS_RSA_WITH_AES_128_CBC_SHA |
| NSExceptionMinimumTLSVersion | 無(wú) | String | 非必填項(xiàng),用來(lái)表示可用的 TLS 最低版本。如果確定域名足夠安全,可以使用這個(gè)鍵。 使用這個(gè)鍵將引發(fā) App Store 的審核,開發(fā)者必須說(shuō)明原因。 可用的值有:<li>TLSv1.0<li>TLSv1.1<li>TLSv1.2 默認(rèn)值為 TLSv1.2。 |
ATS Examples / ATS 配置實(shí)例
下面介紹NSAppTransportSecurity的常見配置:
針對(duì)特定服務(wù)器使用 HTTP 連接
不影響整體 ATS 策略,只針對(duì)特定服務(wù)器進(jìn)行不安全的網(wǎng)絡(luò)請(qǐng)求——例如,從圖片服務(wù)器請(qǐng)求圖片——可在Info.plist中做如下配置:
NSAppTransportSecurity
NSExceptionDomains
"media-server.example.com"
NSExceptionAllowsInsecureHTTPLoads = YES
重要:使用上述配置之前,請(qǐng)注意其可能帶來(lái)的潛在威脅。例如,通過(guò) HTTP 連接從服務(wù)器獲取媒體資源,可能帶來(lái)如下風(fēng)險(xiǎn):
- 攻擊者可以獲悉用戶所訪問(wèn)的媒體資源內(nèi)容
- 加大了 app 的受攻擊面,攻擊者可以通過(guò)惡意文件使得緩沖區(qū)溢出,從而造成 app 異常
針對(duì)特定服務(wù)器降低安全防護(hù)等級(jí)
不影響整體 ATS 策略,只針對(duì)特定服務(wù)器降低 HTTPS 的安全等級(jí)——包括使用較老版本的 TLS / SSL 協(xié)議,不支持正向保密——可在Info.plist中做如下配置:
NSAppTransportSecurity
NSExceptionDomains
"less-secure.example.com"
NSExceptionRequiresForwardSecrecy = NO
NSExceptionMinimumTLSVersion = "TLSv1.0"
針對(duì)受控服務(wù)器使用 HTTPS 連接,其他服務(wù)器使用 HTTP 連接
假設(shè)正在開發(fā)一款瀏覽器應(yīng)用,需要能夠讓用戶訪問(wèn)任意 URL。這種情況下,開發(fā)者應(yīng)該針對(duì)受控服務(wù)器使用安全連接,例如用于發(fā)布 app 更新的服務(wù)器。
為了能夠讓針對(duì)受控服務(wù)器的訪問(wèn)享受 ATS 保護(hù),同時(shí)保證其他不安全訪問(wèn)可用,可在Info.plist中做如下配置:
NSAppTransportSecurity
NSExceptionDomains
"domain-i-control.example.com"
NSExceptionAllowsInsecureHTTPLoads = NO
NSExceptionRequiresForwardSecrecy = YES
NSExceptionMinimumTLSVersion = "TLSv1.2"
"other-domain-i-control.example.com"
NSExceptionAllowsInsecureHTTPLoads = NO
NSExceptionRequiresForwardSecrecy = YES
NSExceptionMinimumTLSVersion = "TLSv1.2"
NSAllowsArbitraryLoads = YES
Debugging ATS Connections / ATS Debugging 相關(guān)
暫略
Using the nscurl Tool to Diagnose ATS Connection Issues / 使用 nscurl 工具診斷 ATS 相關(guān)問(wèn)題
暫略