[iOS] ATS対応徹底攻略!対応策とInfo.plistより行うATSの設定値まとめ

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんぬづは、昼食後にコーヒー屋で淹れたコーヒーを飲んで生産性3倍の田中です。(観測する人によって個人差があります)

最近ATSについて調べているので、まとめてみます。
データソースはこちらを参照しています。
Cocoa Keys

また、弊社平屋がまとめたこちらの記事にもまとめがありますので、合わせてお読みください。
[iOS 9] iOS 9 で追加された App Transport Security の概要 | Developers.IO

目次

 

対象読者

  • これからガッツリATS対応するiOS戦士
  • そもそもATSとは?を知りたい方
  • ATSってどんな対応が必要なんだろう、という規模感を知りたいiOSエンジニアやマネージャの方

 

App Transport Security(ATS)とは

App Transport Securityとは、セキュアな通信を保証するためのiOS 9からの機能です。
このATSという機能が有効な場合、WebAPIとの通信やWebページの表示などをHTTP通信で行うことはできません。
つまり通信先がHTTPS対応されている必要があります。

細かな要件はCocoa KeysのRequirements for Connecting Using ATSの項を参照ください。

また、弊社からも日本語で概要まとめ記事があるので、こちらをご覧いただければより詳しく把握できるかと思われます。
[iOS 9] iOS 9 で追加された App Transport Security の概要 | Developers.IO

Appleの以下の二つのWWDCのセッションによると、2016年末までにApp Storeに並ぶアプリは必ずこのATSに対応する必要があるとのことでした。 もしHTTPでの通信が行いたい場合はアプリ申請時に正当な理由を説明する必要がある、とも述べられています。

How iOS Security Really Works - WWDC 2016 - Videos - Apple Developer
What's New in Security - WWDC 2016 - Videos - Apple Developer

Today I'm proud to say that at the end of 2016, App Transport Security is becoming a requirement for App Store apps. This means that by the end of 2016, when your apps communicate with your own server back-ends, they must do so using a secure TLS channel, using TLS 1.2, unless the data being communicated is bulk data such as media streaming and data that is already encrypted.

How iOS Security Really Works - WWDC 2016 - Videos - Apple Developer より引用


This is going to kick in at the end of 2016 and it means that for most Exceptions you'll need to provide a reasonable justification. So, for all of these Exceptions that actually turn off App Transport Security, or its key properties like using TLS 1.2, you'll need to explain why you need to use this Exception in the first place.

What's New in Security - WWDC 2016 - Videos - Apple Developer より引用

 

Info.plistへの設定値の記述例

スクリーンショット_2016-11-28_10_25_20

ソースコードで見た場合はこちら。

スクリーンショット_2016-11-28_10_25_39

 

Info.plistに設定できるATSに関する設定値

一覧

  • NSAllowsArbitraryLoads
  • NSAllowsArbitraryLoadsForMedia
  • NSAllowsArbitraryLoadsInWebContent
  • NSAllowsLocalNetworking
  • NSExceptionDomains

NSAllowsArbitraryLoads

  • 型: Boolean
  • YESを設定するとすべてのネットワークコネクションに対するATSを無効化できる設定
  • YESを設定するとアプリ申請時にその設定にする正当な理由がもとめられる
  • この設定はiOS 10から追加される以下のキーをInfo.plistに含む場合には無視される
    • NSAllowsArbitraryLoadsForMedia
    • NSAllowsArbitraryLoadsInWebContent
    • NSAllowsLocalNetworking

NSAllowsArbitraryLoadsForMedia

  • 型: Boolean
  • YESを設定するとAV Foundationフレームワークを使うメディアに対するATSを無効化できる設定
  • YESを設定するとアプリ申請時にその設定にする正当な理由がもとめられる
  • iOS 10からの実装のため、iOS 9では無視される

NSAllowsArbitraryLoadsInWebContent

  • 型: Boolean
  • YESを設定するとWebViewからのリクエストに対するATSを無効化できる設定
  • YESを設定するとアプリ申請時にその設定にする正当な理由がもとめられる
  • iOS 10からの実装のため、iOS 9では無視される

NSAllowsLocalNetworking

  • 型: Boolean
  • YESを設定するとATSを無効化することなく、ローカルのリソースを読み込むことができる設定
  • iOS 10からの実装のため、iOS 9では無視される

NSExceptionDomains

  • 型: Dictionary
  • ドメインのホワイトリスト設定
  • このディクショナリの配下にいくつかの設定値がある

 

NSExceptionDomainsに設定できる設定値

一覧

  • NSIncludesSubdomains
  • NSRequiresCertificateTransparency
  • NSExceptionAllowsInsecureHTTPLoads
  • NSExceptionRequiresForwardSecrecy
  • NSExceptionMinimumTLSVersion

NSIncludesSubdomains

  • 型: Boolean
  • YESを設定すると例外ドメインのすべてのサブドメインに対するATSを無効化できる設定

NSRequiresCertificateTransparency

  • 型: Boolean
  • YESを設定するとCertificate Transparencyを要求する設定

NSExceptionAllowsInsecureHTTPLoads

  • 型: Boolean
  • YESに設定するとTLSの要求を変えることなく、安全でないHTTPに対してATSを無効化できる設定
  • YESを設定するとアプリ申請時にその設定にする正当な理由がもとめられる

NSExceptionRequiresForwardSecrecy

  • 型: Boolean
  • NOに設定すると指定されたドメインに対して、PFSをサポートしていないTLS暗号を許可する設定

NSExceptionMinimumTLSVersion

  • 型: String
  • TLSのバージョンを指定する設定
  • 設定するとアプリ申請時にその設定にする正当な理由がもとめられる

 

設定すると審査時に正当な理由がもとめられる設定値

  • NSAllowsArbitraryLoads
  • NSAllowsArbitraryLoadsForMedia
  • NSAllowsArbitraryLoadsInWebContent
  • NSExceptionAllowsInsecureHTTPLoads
  • NSExceptionMinimumTLSVersion

 

ATSの対応策

  • HTTPS対応したプロキシサーバーを噛ませる
  • SFSafariViewControllerを使う・Safariへ遷移させる
  • NSExceptionDomainsを設定してアクセス先のドメインをホワイトリスト化する
  • iOS 9 をサポート OS から外す

アクセス先をHTTPS対応させる

真面目な、正攻法なATS対応。

HTTPS対応したプロキシサーバーを噛ませる

例えばAmazon CloudFrontを使うパターンを先日紹介させていただいたので、こちらも使える一手かもしれません。
自前でHTTPS対応したプロキシを用意するのはなかなか面倒だったりするのですが、CloudFrontを使うとサクっとできました。
[iOS] [AWS] 早い!安い!美味い!Amazon CloudFrontをプロキシにして最速ATS対応! | Developers.IO

SFSafariViewControllerを使う・Safariへ遷移させる

WebAPIではなく、Webページへのアクセスの際にもHTTPS対応が必要になります。
HTTPS対応されていないHTTPのWebページの表示にUIWebViewやWKWebViewを用いると、これもATSに引っかかってしまいます。

SFSafariViewControllerとsafariに関してはATSの対象外のため、Webページの表示が行いたいだけの場合はこれらを使う手が考えられます。
ここで注意しなければいけないのはアフィリエイトが関係する場合や、アプリで取得したセッション情報を利用する場合には別途それも適切な対応が必要です。

NSExceptionDomainsを設定してアクセス先のドメインをホワイトリスト化する

NSExceptionDomainsでドメインを指定してホワイトリスト化することもできます。
ただし配下の設定値によっては申請時に正当な理由を求められるものも存在するので注意は必要です。

iOS 9 をサポート OS から外す

iOS 9を対応することの問題として、NSAllowsArbitraryLoadsInWebContentがiOS 10からの機能であることが挙げられます。
API通信の話は除いて、WebViewを使うアプリであればこのNSAllowsArbitraryLoadsInWebContentがYESで設定されていればATS対応は完了となります。
しかしiOS 9にも対応するためには例外ドメインをNSExceptionDomainsで個別に設定する必要が出てしまいます。
この対応はアプリによってはとてもコストがかかりすぎる場合があります。

案件やお客さんの要望によってはまだiOS 9を対応しておきたいということもあるかと思われますが、開発コストとの相談になります。
開発コストとのトレードオフのパラメータとしてiOS 10の普及率が挙げられます。以下にその資料を載せておきます。

Mixpanelによるとこの記事執筆時のiOS 10の普及率は77.96%
Mixpanel Trends - Mixpanel | Mobile Analytics

Appleから公表されているiOS 10の普及率は10/25日時点で60%となっています。
App Store - Support - Apple Developer

Mixpanelの情報と公式からの情報に差があるのは取得している日付に差があることも考えられますので、そちらも考慮して参考にしてください。

 

まとめ

WebAPIサーバーやシングルページで遷移がないWebページであれば、問い合わせ先が決まっているので対応は難しくないかと思われます。
問題は自由にページ遷移してしまうWebViewで、決め打ちのURLが決まっていないものです。
ブラウジングしたり、関連ページに遷移する必要のあるアプリは大変かもしれません...。

どんな理由であればHTTPのままでも生き残れるのかは実際に対応必須になってからラインが徐々に判明してくることになりそうですね。
また審査員によって通るか通らないかとかあるのかなあと考えると、「さすが俺たちのAppleだぜ!」という感じが出ますね。
はい、着いていきます。

 

参考