在iOS9中Apple新增了App Transport Security(ATS)特性,其主要目的就是規定了App與服務器通信時將默認要求使用安全的連接,旨在提高App的安全性,APP在使用higher-level API(如NSURLConnection, NSURLSession等)進行通信時如果不采用TLS 1.2協議進行傳輸,iOS將會報錯。Apple推薦創建新的App和在更新已有的App時都應盡快對ATS進行適配。本文將介紹在Xcode7中對ATS進行配置。
當我們在iOS9下直接使用HTTP連接時,會出現如下錯誤:
App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure.
Temporary exceptions can be configured via your app's Info.plist file.
如果你希望暫時不適配ATS,則可以在項目的info.plist中添加如下配置,使所有未特殊指定的連接都不開啟ATS特性,即允許明文傳輸的Http連接。其中<key>NSAppTansportSecurtiy</key>
是ATS配置的根節點
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
如果你希望適配ATS,則需注意ATS特性有如下三個需求
- 必須要基于TLS 1.2版本進行安全傳輸
- 加密方式必須只能是支持前向加密的方法
- 證書必須至少使用SHA256的Fingerprint和至少2048bit的RSA Key或者至少256bit的Elliptic-Curve(ECC)Key
ATS接受如下加密方法:
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
如果開啟了ATS但是訪問的安全連接不符合上述三個條件的任意一個,就會報錯。可以通過在info.plist中對個別域名配置例外情況來允許非安全連接或者不完全支持ATS的安全連接。可以參考如下的例子
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>wty.im</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSExceptionMinimumTLSVersion</key>
<string>1.1</string>
</dict>
</dict>
</dict>
所有可以設置的參數如下:
當NSExceptionRequiresForwardSecrecy設置為NO時,ATS將額外支持以下加密方法:
TLS_RSA_WITH_AES_256_GCM_SHA384
TLS_RSA_WITH_AES_128_GCM_SHA256
TLS_RSA_WITH_AES_256_CBC_SHA256
TLS_RSA_WITH_AES_256_CBC_SHA
TLS_RSA_WITH_AES_128_CBC_SHA256
TLS_RSA_WITH_AES_128_CBC_SHA
更多ATS的信息可以參考iOS Developer Library的App Transport Security Technote
本文個人博客地址: http://wty.im/2015/09/22/iOS9-ATS-Feature-and-enable-insecure-http-connection-in-xcode7/
Github: https://github.com/wty21cn/