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