iOS9 HTTPS
原文地址:?https://github.com/ChenYilong/iOS9AdaptationTips
?
關(guān)于App Transport Security,每個應(yīng)用都屬于4個大類當(dāng)中的一類。我們來看看每一個大類都是怎樣影響應(yīng)用的。
| 1. | HTTPS Only (只有HTTPS,所有情況下都使用ATS) | 如果你的應(yīng)用只基于支持HTTPS的服務(wù)器,你的應(yīng)用不需要做任何改變。但是,注意App Transport Security要求TLS 1.2,而且它要求站點使用支持forward secrecy協(xié)議的密碼。證書也要求是符合ATS規(guī)格的。因此慎重檢查與你的應(yīng)用交互的服務(wù)器是不是符合ATS的要求。 |
| 2. | Mix & Match(混合) | 如果你的服務(wù)器不符合ATS要求,你需要在你的應(yīng)用的 Info.plist 文件中說明哪些地址是不符合ATS要求的。 |
| 3. | Opt Out(禁用ATS) | 如果你在創(chuàng)建一個網(wǎng)頁瀏覽器,因為你不能確定用戶將要訪問哪個網(wǎng)頁,也就不可能指明這些網(wǎng)頁是否支持ATS要求且在HTTPS上傳輸。在這種情況下,只能配置為禁用ATS。 |
| 4. | Opt Out With Exceptions(除特殊情況外,都不使用ATS) | 如果想禁用ATS的同時又想定義一些例外。這個應(yīng)用場景是當(dāng)你的應(yīng)用需要從很多不符合ATS要求的服務(wù)器上取數(shù)據(jù),但是也要與一個你可控的API(符合ATS要求)交互。在這種情況下,需要在應(yīng)用的 Info.plist 文件中配置為允許所有請求,但是你也指定了一個或多個例外來表明哪些請求是必須符合ATS的要求。 |
下面分別做一下介紹:
1.HTTPS Only (只有HTTPS,所有情況下都使用ATS)
如果你的應(yīng)用只基于支持HTTPS的服務(wù)器,那么你太幸運了。你的應(yīng)用不需要做任何改變。
唯一需要做的事情就是使用?NSURLSession?。如果你的開發(fā)目標(biāo)是iOS 9或者 OS X EI Capitan之后,ATS 的最佳實踐將會應(yīng)用到所有基于?NSURLSession?的網(wǎng)絡(luò)。
但也有人遇到過這樣的疑惑:服務(wù)器已支持TLS 1.2 SSL ,但iOS9上還是不行,還要進(jìn)行本文提出的適配操作。
那是因為:要注意 App Transport Security 要求 TLS 1.2,而且它要求站點使用支持forward secrecy協(xié)議的密碼。證書也要求是符合ATS規(guī)格的,ATS只信任知名CA頒發(fā)的證書,小公司所使用的 self signed certificate,還是會被ATS攔截。因此慎重檢查與你的應(yīng)用交互的服務(wù)器是不是符合ATS的要求非常重要。對此,建議使用下文中給出的NSExceptionDomains,并將你們公司的域名掛在下面。
官方文檔?App Transport Security Technote?對CA頒發(fā)的證書要求:
Certificates must be signed using a SHA256 or better signature hash algorithm, with either a 2048 bit or greater RSA key or a 256 bit or greater Elliptic-Curve (ECC) key. Invalid certificates result in a hard failure and no connection
2.Mix & Match(混合)
如果你的服務(wù)器不符合ATS要求。
比如當(dāng)你遇到以下三個不符合 ATS 要求的服務(wù)器的域名時:
你可以分別設(shè)置如下:
api.insecuredomain.com
Info.plist 配置中的XML源碼如下所示:
<key>NSAppTransportSecurity</key><dict><key>NSExceptionDomains</key><dict><key>api.insecuredomain.com</key><dict><!--允許App進(jìn)行不安全的HTTP請求--><key>NSExceptionAllowsInsecureHTTPLoads</key><true/><!--適用于這個特定域名下的所有子域--><key>NSIncludesSubdomains</key><true/></dict></dict></dict>
在 plist 文件里顯示如下:
我們定義的第一個“例外”(Exception)告訴ATS當(dāng)與這個子域交互的時候撤銷了必須使用HTTPS的要求。注意這個僅僅針對在“例外”(Exception)中聲明了的子域。非常重要的一點是要理解NSExceptionAllowsInsecureHTTPLoads關(guān)鍵字并不僅僅只是與使用HTTPS相關(guān)。這個“例外”(Exception)指明了對于那個域名,所有的App Transport Security的要求都被撤銷了。
cdn.domain.com Info.plist 配置中的XML源碼如下所示:
<key>NSAppTransportSecurity</key><dict><key>NSExceptionDomains</key><dict><key>cdn.somedomain.com</key><dict><key>NSThirdPartyExceptionMinimumTLSVersion</key><string>TLSv1.1</string></dict></dict></dict>
在 plist 文件里顯示如下:
很可能你的應(yīng)用是與一個支持HTTPS傳輸數(shù)據(jù)的服務(wù)器交互,但是并沒有使用TLS 1.2或更高。在這種情況下,你定義一個“例外”(Exception),它指明應(yīng)該使用的最小的TLS的版本。這比完全撤銷那個域名的App Transport Security要更好更安全。
thatotherdomain.com
Info.plist 配置中的XML源碼如下所示:
<key>NSAppTransportSecurity</key><dict><key>NSExceptionDomains</key><dict><key>thatotherdomain.com</key><dict><!--適用于這個特定域名下的所有子域--><key>NSIncludesSubdomains</key><true/><!--擴展可接受的密碼列表:這個域名可以使用不支持 forward secrecy 協(xié)議的密碼--><key>NSExceptionRequiresForwardSecrecy</key><false/><!--允許App進(jìn)行不安全的HTTP請求--><key>NSExceptionAllowsInsecureHTTPLoads</key><true/><!--在這里聲明所支持的 TLS 最低版本--><key>NSExceptionMinimumTLSVersion</key><string>TLSv1.1</string></dict></dict></dict>
在 plist 文件里顯示如下:
NSIncludesSubdomains?關(guān)鍵字告訴 App Transport Security 這個“例外”(Exception)適用于這個特定域名的所有子域。這個“例外”(Exception)還進(jìn)一步通過擴展可接受的密碼列表來定義這個域名可以使用不支持forward secrecy(NSExceptionRequiresForwardSecrecy?) 協(xié)議的密碼。想了解更多關(guān)于forward secrecy的信息,推薦去看官方文檔?Apple's technote?。
如果你的App中同時用到了這三個域名,那么應(yīng)該是這樣:
<key>NSAppTransportSecurity</key><dict><key>NSExceptionDomains</key><dict><key>api.insecuredomain.com</key><dict><key>NSExceptionAllowsInsecureHTTPLoads</key><false/></dict><key>cdn.somedomain.com</key><dict><key>NSThirdPartyExceptionMinimumTLSVersion</key><string>TLSv1.1</string></dict><key>thatotherdomain.com</key><dict><key>NSIncludesSubdomains</key><true/><key>NSExceptionRequiresForwardSecrecy</key><false/></dict></dict></dict>
3. Opt Out(禁用ATS)
上面是比較嚴(yán)謹(jǐn)?shù)淖龇?#xff0c;指定了能訪問哪些特定的HTTP。當(dāng)然也有暴力的做法: 徹底倒退回不安全的HTTP網(wǎng)絡(luò)請求,能任意進(jìn)行HTTP請求,比如你在開發(fā)一款瀏覽器App,或者你想偷懶,或者后臺想偷懶,或者公司不給你升級服務(wù)器。。。
你可以在Info.plist 配置中改用下面的XML源碼:
<key>NSAppTransportSecurity</key><dict><!--徹底倒退回不安全的HTTP網(wǎng)絡(luò)請求,能任意進(jìn)行HTTP請求 (不建議這樣做)--><key>NSAllowsArbitraryLoads</key><true/></dict>
在 plist 文件里顯示如下:
4. Opt Out With Exceptions(除特殊情況外,都不使用ATS)
上面已經(jīng)介紹了三種情景,還有一種可能你也會遇到:
當(dāng)你禁用ATS的同時又想定義一些“例外”(Exception)。這個應(yīng)用場景是當(dāng)你的應(yīng)用需要從很多不符合ATS要求的服務(wù)器上取數(shù)據(jù),但是也要與一個你可控的API(符合ATS要求)交互。在這種情況下,在應(yīng)用的Info.plist文件中配置為允許所有請求,但是你也指定了一個或多個“例外”(Exception)來表明哪些地址是必須符合 App Transport Security 要求的。下面是Info.plist文件應(yīng)該會有的內(nèi)容:
<key>NSAppTransportSecurity</key><dict><key>NSAllowsArbitraryLoads</key><true/><key>NSExceptionDomains</key><dict><key>api.tutsplus.com</key><dict><key>NSExceptionAllowsInsecureHTTPLoads</key><false/></dict></dict></dict>
在 plist 文件里顯示如下:
?
?
Certificate Transparency
雖然ATS大多數(shù)安全特性都是默認(rèn)可用的,Certificate Transparency 是必須設(shè)置的。如果你有支持Certificate Transparency的證書,你可以檢查NSRequiresCertificateTransparency關(guān)鍵字來使用Certificate Transparency。再次強調(diào),如果你的證書不支持Certificate Transparency,此項需要設(shè)置為不可用。
如果需要調(diào)試一些由于采用了ATS而產(chǎn)生的問題,需要設(shè)置CFNETWORK_DIAGNOSTICS為1,這樣就會打印出包含被訪問的URL和ATS錯誤在內(nèi)的NSURLSession錯誤信息。要確保處理了遇到的所有的錯誤消息,這樣才能使ATS易于提高可靠性和擴展性。
?
轉(zhuǎn)載于:https://www.cnblogs.com/FranZhou/p/5190506.html
總結(jié)
以上是生活随笔為你收集整理的iOS9 HTTPS的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2-1:C++快速入门之命名空间
- 下一篇: 编译并使用boost库(win7+boo