蘋果規定 從2017年1月1日起,新提交的 app 不允許使用NSAllowsArbitraryLoads來繞過ATS(全稱:App Transport Security)的限制。
以前為了能兼容http和不滿足規定的https,我們采用了最偷懶的做法:設置NSAllowsArbitraryLoads 為YES。即:
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/>
</dict>
現在這個方式被蘋果給禁止了。
一、使用默認的ATS設置要滿足:
1、https 要基於TLS 1.2或以上版本。
2、證書的加密的算法要至少要SHA256的算法,用至少是2048位的RSA的key 或至少是256位的Elliptic-Curve(ECC)的key所產生的證書
3、加密算法也是有限制,就是ATS中的ForwardSecrecy(超前的密碼保護算法)配置項,需要在以下列表中,詳見:蘋果文檔。
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
如果不符合上述3各要求,請求接口會報錯:
NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)
二、如何適配
1、讓服務端或運維的小伙伴 配置下tomcat或nginx的TSL版本和證書算法,更新最新的SDK,比如友盟統計SDK剛剛可以支持ATS了,新浪微博等用的還是TLS1.0版本。需要配置一下。
2、我們公司的證書算法達不到蘋果的要求,運維的童鞋又很忙(不想改),因為蘋果只是禁用了NSAllowsArbitraryLoads選項,我們可以通過其他的選項來兼容以前的接口。如下:
<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>xxxx.com</key> <dict> <key>NSExceptionMinimumTLSVersion</key> <string>TLSv1.0</string> <key>NSThirdPartyExceptionRequiresForwardSecrecy</key> <false/> <key>NSIncludesSubdomains</key> <true/> </dict> </dict> </dict>
擴展:我們公司用的 Red ware(類似F5) 不支持 ECDHE算法,所以上面我們配置了NSThirdPartyExceptionRequiresForwardSecrecy。
目前最常用的密鑰交換算法有 RSA 和 ECDHE:RSA 歷史悠久,支持度好,但不支持 PFS(Perfect Forward Secrecy);而 ECDHE 是使用了 ECC(橢圓曲線)的 DH(Diffie-Hellman)算法,計算速度快,支持 PFS。
在 RSA 密鑰交換中,瀏覽器使用證書提供的 RSA 公鑰加密相關信息,如果服務端能解密,意味着服務端擁有證書對應的私鑰,同時也能算出對稱加密所需密鑰。密鑰交換和服務端認證合並在一起。
在 ECDHE 密鑰交換中,服務端使用證書私鑰對相關信息進行簽名,如果瀏覽器能用證書公鑰驗證簽名,就說明服務端確實擁有對應私鑰,從而完成了服務端認證。密鑰交換和服務端認證是完全分開的。
可用於 ECDHE 數字簽名的算法主要有 RSA 和 ECDSA,也就是目前密鑰交換 + 簽名有三種主流選擇:
- RSA 密鑰交換(無需簽名);
- ECDHE 密鑰交換、RSA 簽名;
- ECDHE 密鑰交換、ECDSA 簽名;
有興趣了解更多的可以看: ECC證書
擴展2:如果用了nginx,可以直接在nginx.conf 中配置ssl_ciphers 設置加密選項。
三、ATS配置說明:
詳細說明:
NSAppTransportSecurity : 配置ATS的跟屬性。
NSAllowsArbitraryLoads : 是否允許所有的連接,包括http。默認值是No,如果設置成YES,就可以使用http了。2017年1月1號后該選項被禁用。
NSExceptionDomains : 用於配置例外的域名,即在該配置項中的域不需要通過ATS的驗證。
< domain-name-for-exception-as-string > : 需要添加例外的域名字符串,如:baidu.com
NSExceptionMinimumTLSVerion :最低支持的TSL的版本號,可用的配置有TLSv1.0、TLSv1.1以及TLSv1.2三個配置項。
NSExceptionRequiresForwardSecrecy :是否滿足上文中列舉的加密算法。因為我們服務端不支持這些算法,所以我們設置為NO。
NSExceptionAllowsInsecureHTTPLoads : 是否為HTTPS的服務器。用這個配置可用訪問那些沒有證書、自簽名證書、過期證書以及證書與域名匹配不上的服務器。默認值是NO。
NSIncludesSubdomains : 子域名是否使用同樣的配置。默認值是NO。如果設置為YES,則子域名如api.baidu.com也都使用相同的配置
NSThirdPartyExceptionMinimumTLSVersion : 如果是域名為第三的域名,且開發人員無法控制的情況下進行配置。設置最低支持的TSL的版本號
NSThirdPartyExceptionRequiresForwardSecrecy : 如果是域名為第三的域名,且開發人員無法控制的情況下進行配置ForwardSecrecy。
歡迎關注我的 今日頭條號 名稱: 雲端夢想科技
歡迎關注我的 微信公眾號:dreams2999