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 内が真っ白になります.
エラーメッセージを見ると,
と言っています.
対策 (3つの回避策)
回避策は 3つあります.
- 参照先WEBサイトを, SSL通信に対応 AND TLS1.2対応 AND Apple指定の暗号化方式採用 にする (推奨)
- アプリのATSの設定について, 『http://example.com だけ許して』と, ドメイン指定する. (通信可能ホワイトリストを作るということ)
- アプリの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
Key |
Type |
---|---|
|
Dictionary |
|
Boolean |
|
Dictionary |
|
Dictionary |
|
String |
|
Boolean |
|
Boolean |
|
Boolean |
|
String |
|
Boolean |
|
Boolean |
[…] なんかめっちゃ長くなったので, 別記事に分けました. こちら参照のこと: 【iOS 9 対応】App Transport Security 対策 […]