NSAppTransportSecurity (對應的值為字典類型)被用來定義 app 在進行網絡請求時的安全設定:為現有安全機制設定特例,或者開啟新的安全特性。
在蘋果的開發平臺上,有壹種被稱為 App Transport Security(ATS) 的網絡安全機制,適用於 app 以及 app extension,默認開啟。這項機制確保 app 在進行網絡訪問時,使用業界標準的,沒有已知重大安全隱患的協議和加密方式,以此確保用戶的隱私和數據完整性。從而培養用戶對您的 app 的信任。
通過在 info.plist 中配置這個鍵,開發者可以自定義網絡安全策略。例如:
對 NSAppTransportSecurity 的支持自 iOS9.0,OS X v10.11 開始,適用於 app 和 app extension。
自 iOS10.0,macOS 10.12 開始,增加了對下列子鍵的支持:
對於使用 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 )。更多關於安全連接的信息,請查閱 HTTPS Server Trust Evaluation 。
下面是字典 NSAppTransportSecurity 的總體結構,所有鍵都是非必填項:
可以看出,所有鍵可以分為兩類:主鍵,這些鍵用來定義 app 的總體 ATS 策略;子鍵,即 NSExceptionDomains 下面的鍵,使用這些鍵針對某個域名單獨配置。
主鍵包括:
閱讀 表2 ,獲取關於上述主鍵的詳細信息。
所有的子鍵都屬於 NSExceptionDomain 。向 Info.plist 中添加這壹主鍵:
例如,及時之前設置 NSAllowsArbitraryLoadsInMedia 為 YES,然而 NSExceptionDomain 所代表的域名依然不能訪問不安全的媒體內容。
基於這樣的設定,可以針對域名進行 ATS 配置,增加或減少安全措施。例如:
還參考 Certificate Transparency ,保證訪問特定域名時的安全,詳情見 Certificate Transparency 。
NSExceptionDomains 字典構成:
閱讀 表3 ,獲取關於 NSExceptionDomains 的進壹步詳細信息。
NSURLSession 以及所有與其相關的 API 都實現了對 ATS 的支持;如果您的 app 基於 iOS9.0 SDK 或 OS X v10.11 SDK 以上版本開發,ATS 自動開啟。(較老的 NSURLConnection 同樣會在上述 SDK 中開啟對 ATS 的支持。)然而,在使用底層網絡 API 或第三方網絡庫時,無法受到 ATS 的保護。
iOS9.0 或 OS X v10.11 以下版本,不支持 ATS, NSAppTransportSecurity 會被操作系統忽略。當 ATS 不可用時,系統將根據 RFC 2818 提供標準的 HTTPS 安全策略,對服務端進行驗證。
當您的 app 運行在 iOS9.0 或者 OS X v10.11以下時,網絡連接仍然可用,但 ATS 不起作用。
ATS 只針對 公***域名 起效。ATS 對已下連接無效:
為了連接非法域名或本地域名,需要將 NSAllowsLocalNetworking 設置為 YES。
在 ATS 完全開啟的情況下,系統要求 app 的 HTTPS 連接必須滿足以下要求:
上面的標準,未來可能會發生變化。但不會影響到 app 二進制包的兼容性。
暫略
能否自行改寫服務器授信校驗規則,取決於 ATS 是否針對某個域名開啟。解釋如下:
某些對 ATS 的配置會引發 App Store 的審核,開發者必須說明原因。這些鍵有:
以下是壹些原因說明例子,供參考:
向 App Store 提交審核時,開發者應主動提供足夠的信息,以便解釋 app 無法使用安全連接的原因。
表2列出了 NSAppTransportSecurity 字典所有主鍵信息,通過定義這些主鍵,開發者可以配置 app 的網絡行為。同 NSExceptionDomains 相關的子鍵信息請查看表3。
表2 ATS 字典主鍵
表3列舉了用來針對某個域名進行網絡安全配置所使用的鍵。
表3 針對某個域名進行網絡安全配置的子鍵
下面介紹 NSAppTransportSecurity 的常見配置:
不影響整體 ATS 策略,只針對特定服務器進行不安全的網絡請求——例如,從圖片服務器請求圖片——可在 Info.plist 中做如下配置:
重要: 使用上述配置之前,請註意其可能帶來的潛在威脅。例如,通過 HTTP 連接從服務器獲取媒體資源,可能帶來如下風險:
不影響整體 ATS 策略,只針對特定服務器降低 HTTPS 的安全等級——包括使用較老版本的 TLS / SSL 協議,不支持正向保密——可在 Info.plist 中做如下配置:
假設正在開發壹款瀏覽器應用,需要能夠讓用戶訪問任意 URL。這種情況下,開發者應該針對受控服務器使用安全連接,例如用於發布 app 更新的服務器。
為了能夠讓針對受控服務器的訪問享受 ATS 保護,同時保證其他不安全訪問可用,可在 Info.plist 中做如下配置:
暫略
暫略