iOS的ATS配置 - 2017年前ATS規定的適配


蘋果規定 從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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM