本文由CocoaChina譯者lynulzy(社區ID,博客)翻譯自noir的博客
原文:WORKING WITH APPLE’S APP TRANSPORT SECURITY
這篇文章是對WWDC大會中提出的App Transport Security(應用通訊安全)模式的解讀,蘋果在 App Transport Security Technote 中也進行了解讀。
隨著iOS 9和OS X EI Capitan 的發布,蘋果官方引入了應用通訊安全模式的概念。簡而言之,應用通訊安全模式強制性要求應用需要使用最佳的安全通訊協議,比如TLS 1.2版本和前向保密技術。在不久的將來,蘋果也將更新這些最佳實踐以確保他們在保障網絡數據安全的潮流中走在前列。
在iOS 9 和 OS X EI Caption之後,當使用NSURLSession的時候默認會開啟ATS。然而不幸的是,對於大多數開發者而言,這將意味著在他們基於新版本的操作系統做開發時,情況有了很大的變化。好消息是,蘋果官方提供了一些可選配置項來決定是否開啟ATS模式,也就是可以選擇開啟或者不開啟。
開發者可以針對某些確定的URL不使用ATS,這需要在工程中的info.plist中標記NSExceptionDomains。在NSExceptionDomains字典中,可以顯式的指定一些不使用ATS的URL。這些你可以使用的例子可以是:
- NSIncludesSubdomains
- NSExceptionAllowInsecureHTTPLoads
- NSExceptionRequiresForwardSecrecy
- NSExceptionMinimumTLSVersion
- NSThirdPartyExceptionAllowsInsecureHTTPLoads
- NSThirdPartyExceptionMinimumTLSVersion
- NSThirdPartyExceptionRequiresForwardSecrecy
這些關鍵字使我們可以更加細致的設置針對不使用ATS的域名情況下禁用ATS或者一些特殊的ATS選項。
**在iOS 9 的beta1版本中,上述的關鍵字是錯誤的,應該使用如下關鍵字:**
- NSTemporaryExceptionAllowsInsecureHTTPLoads
- NSTemporaryExceptionRequiresForwardSecrecy
- NSTemporaryExceptionMinimumTLSVersion
- NSTemporaryThirdPartyExceptionAllowsInsecureHTTPLoads
- NSTemporaryThirdPartyExceptionMinimumTLSVersion
- NSTemporaryThirdPartyExceptionRequiresForwardSecrecy
這些關鍵字在不久以後肯定會被替換掉。如果可以,你應該使用第一組的關鍵字,因為蘋果官方支持這些關鍵字。雖然你正在使用臨時的關鍵字,但它應該在將來的beta版本中還是可以繼續使用的。
下面是一些開發者可能會在開發過程中遇到的情況。
例1 所有情況下都使用ATS
這是最簡單的情況。唯一需要做的事情就是使用NSURLSession。如果你的開發目標是iOS 9或者 OS X EI Capitan之後,ATS的最佳實踐將會應用到所有基於NSURLSession的網絡。
例2 特殊情況除外,都使用ATS
如果你希望自己所有的域名,除了一些已知並不會使用ATS之外的,所有通信都使用ATS。這種情況下你可以指定一些不使用ATS的特殊情況,而其余的情況使用ATS。對於這種場景,可以使用*NSExceptionDomains*來標識使用ATS默認設置的域。為了篩選出所有域或者子域,可以創建一個包含想要排除使用ATS的URL的字典,然後設置其中的*NSExceptionAllowInsecureHTTPLoads*的值為true。如果想要對於這些域完全禁用ATS,也可以指定更多的規則來限制,如使用*NSExceptionRequiresForwardSecrecy*和*NSExceptionMinimumTLSVersion*關鍵字。
例3 除特殊情況外,都不使用ATS
一種與上例相反的情況,你可能進希望在你明確知道支持的域內使用ATS。比如,如果開發一個Twitter客戶端,可能需要有難以計數的可能不支持ATS的URL需要加載,可是你希望網絡狀況想發起登錄請求和請求Twitter服務器的其他請求一致。在這種情況下,你可以設置禁用ATS為默認選項,然後指定需要使用ATS的URL。
這種情況下,需要設置*NSAllowArbitraryLoads*為true,然後在*NSExceptionDomains*字典中定義需要保證安全性的URL。需要保證安全性的每個域都需要有自己的字典,而且字典中的*NSExceptionAllowInsecureHTTPLoads*選項需要設置為false。
例4 低級的ATS
在某些情況下,可能ATS用於所有情況,或者一些,或者是自有的URL,但是並未針對所有的ATS最佳實踐全部支持。也許你的應用服務器僅支持TLS1.2,但是不支持之後的版本,與其把涉及到的所有域都設置為不用ATS,不如設置為支持版本較低的ATS。這種場景下,需要創建一個*NSExceptionDomains*字典,這是一個對於每個域都要重用的字典選項,然後設置*NSExceptionRequiresForwardSecrecy*值為false。類似的,如果你希望向前支持,但是需要最低版本的TLS,你可以通過*NSExceptionMinimumTLSVersion*關鍵字定義你的應用服務器所支持的TLS版本。
例5 NSA-friendly 模式
如果想完全不使用ATS(不建議使用這種模式,並且需要你完全理解其隱藏的危險。)你可以在info.plist中設置*NSAllowArbitraryLoads*屬性為true。
第三方鍵值
你可能注意到一些關鍵字像是使用了一些其他關鍵字中的詞但是在前面加上了"ThirdParty"字樣:
- NSThirdPartyExceptionAllowsInsecureHTTPLoads
- NSThirdPartyExceptionMinimumTLSVersion
- NSThirdPartyExceptionRequiresForwardSecrecy
在功能上,這些關鍵字與不含有"ThirdParty"的關鍵字有同樣的效果。而且實際運行中所調用的代碼將會完全忽略是否使用"ThirdParty"關鍵字。你應該使用適用於你的場景的關鍵字而不必過多考慮這些。
Certificate Transparency
雖然ATS大多數安全特性都是默認可用的,Certificate Transparency 是必須設置的。如果你有支持Certificate Transparency的證書,你可以檢查NSRequiresCertificateTransparency關鍵字來使用Certificate Transparency。再次強調,如果你的證書不支持Certificate Transparency,此項需要設置為不可用。
如果需要調試一些由於采用了ATS而產生的問題,需要設置CFNETWORK_DIAGNOSTICS為1,這樣就會打印出包含被訪問的URL和ATS錯誤在內的NSURLSession錯誤信息。要確保處理了遇到的所有的錯誤消息,這樣才能使ATS易於提高可靠性和擴展性。
以上所有信息都 WWDC 2015 NSURLSession session 中有所體現。最後,蘋果強調需要上報開發過程所有的問題並且需要密切關注將來beta版本中的可能產生的變化。