Chomado's Blog
You Are Reading

【iOS 9 対応】App Transport Security 対策

1
技術系メモ

【iOS 9 対応】App Transport Security 対策


iOS 9 対応において, 一番開発者を発狂させたものが, この App Transport Security (ATS) だと思います.
やったー! iOS 9 端末でアプリ起動したー! って喜んでたら, WebView の中真っ白〜と. (SSL通信非対応 OR TLS1.2非対応 OR 弱い暗号化方式使用など, Apple指定の暗号化方式を満たしていない Webページ参照時のみ)

他の iOS 9 対応でやったことについては 次の記事で書きました:
【iOS 9 対応】Working with New Features in iOS 9

App Transport Security (ATS) とは

ATS とは, ご存じの方が多いと思いますが,
ざっくり言うと,

Apple は, App Transport Security という名前の,
「ユーザに提供する通信は, セキュアなものしか許さないよ! セキュアじゃないものは全部シャットアウトするよ!」という内容の,
新しい基準を設けました.

iOS 9 以降からはすべてのアプリがこの基準の対象となります. (だからATSの要件を満たしていない Webページは読み込まれず, WebView の中が真っ白になる)

/* iOS 9 標準搭載の Safari の拡張機能の コンテンツブロック/広告ブロック機能 といい, Apple は セキュリティに本気出してますね! さすがAppleです!! */

今後 Apple が指定する ATS の要件(後述)を満たすのが基本になります.
一応 , 今のところは, ATS を無効にすることもできるようです (非推奨) が, おそらく徐々に 審査の基準になっていくと思われます.

何が驚いた – WebView 内が真っ白

WebView で HTTPS通信不可のページを読み込もうとしたら, WebView 内が真っ白になります.
エラーメッセージを見ると,

The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.

と言っています.

対策 (3つの回避策)

回避策は 3つあります.

  1. 参照先WEBサイトを, SSL通信に対応 AND TLS1.2対応 AND Apple指定の暗号化方式採用 にする (推奨)
  2. アプリのATSの設定について, 『http://example.com だけ許して』と, ドメイン指定する. (通信可能ホワイトリストを作るということ)
  3. アプリのATSを無効にする. (非推奨) (おそらく近いうちに審査に引っかかる)

おそらく多くの人が取り敢えずの措置として取った対策, 2番の『ホワイトリスト制作』について書きます.

[ 注意 ] 2番と3番は, あくまで『一時的な回避策』として使われるべきで, 実際は, Apple の指定するセキュアな通信(ATSの要件/後述)に対応するべきです.

HTTP通信可能ホワイトリストを作成

2番の『アプリのATSの設定について, 『http://example.com だけ許して』と, ドメイン指定する. (通信可能ホワイトリストを作るということ)』についてです.

info.plist に 以下を追記:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    (既存の項目たち)
    <!-- ここから -->
    <key>NSAppTransportSecurity</key>
    <dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSExceptionDomains</key>
        <dict>
        <key>example.com</key><!-- ここにHTTP通信を許可するドメイン -->
            <dict>
            <!-- サブドメインも含める -->
            <key>NSIncludesSubdomains</key>
            <true/>
            <!-- HTTP通信するの許してね-->
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            </dict>
        </dict>
    </dict>
    <!-- ここまで -->
</dict>
</plist>

Apple の 指定する基準

仮に上の方法で取り敢えず回避したとしても, 近いうちに
以下を満たしてある状態であるべきです.
(まあもしユーザ認証とかあるアプリ開発してたら, 今更言われなくてもサービス開始時の時点でこの程度はされているはずですが)

以下が App Transport Security の要件です:

  • The server must support at least Transport Layer Security (TLS) protocol version 1.2. (TLS v1.2 以上である)
  • Connection ciphers are limited to those that provide forward secrecy (see the list of ciphers below.) (下に列挙した暗号スイートしか認めない)
  • (サーバ証明書に求められる条件について,) 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. (無効な証明書を使用した場合は強制的に失敗になり接続できない)

These are the accepted ciphers:

  • 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

公式ドキュメントより:
App Transport Security Technote | Apple Developer

注意

ATS ついては多くの人が書いていますが, 初期の頃の記事(7月かな?)は
NSExceptionAllowsInsecureHTTPLoads
NSExceptionRequiresForwardSecrecy

NSTemporaryExceptionAllowsInsecureHTTPLoads
NSTemporaryExceptionRequiresForwardSecrecy
と, Temporary つけてる版を書いているのが多い気がします.

Temporary は iOS 9 beta の バージョン 5 の現時点では不要です.

詳しくは公式ドキュメント参照のこと:
App Transport Security Technote | Apple Developer

Table 1-1Info.plist keys: structure and types

Key

Type

NSAppTransportSecurity

Dictionary

    NSAllowsArbitraryLoads

Boolean

    NSExceptionDomains

Dictionary

        <domain-name-for-exception-as-string>

Dictionary

            NSExceptionMinimumTLSVersion

String

            NSExceptionRequiresForwardSecrecy

Boolean

            NSExceptionAllowsInsecureHTTPLoads

Boolean

            NSIncludesSubdomains

Boolean

            NSThirdPartyExceptionMinimumTLSVersion

String

            NSThirdPartyExceptionRequiresForwardSecrecy

Boolean

            NSThirdPartyExceptionAllowsInsecureHTTPLoads

Boolean


Madoka Chomado (ちょまど)

千代田まどかです。よく「ちょまど」と呼ばれます。Microsoft 社員。文系出身プログラマ兼マンガ家です。

(1) Comment

  1. […] なんかめっちゃ長くなったので, 別記事に分けました. こちら参照のこと: 【iOS 9 対応】App Transport Security 対策 […]

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です