iOS9からiOSアプリにおいてATS(App Transport Security)がデフォルトで有効化されます。このATSにより、iOSアプリではSSL通信が強制されるようになります。今回はこの影響についてまとめます:
iOSにおけるSSLの強制適用
- ATSがデフォルトで有効化される条件
- アプリをiOS9用にビルドした場合(Xcode7)
- iOS8以前向けにビルドした場合、ATSの強制適用は行われない
- アプリをiOS9用にビルドした場合(Xcode7)
- ATS有効化の影響範囲
- 概要
- アプリからの通信において、HTTPアクセスがエラーとなる
- 対象となるAPI
- NSURLConnection, CFURL, NSURLSession
- 関連クラス
- WebView
- HTTPのWebページは表示しない(内部エラー)
- 補足
- SFSafariViewControllerはATSの影響を受けない
- WebView
- 補足
- ATSによるHTTPSへの自動変換は行われない
- アプリに埋め込んだURLは、すべてHTTPSへの変換が必要
- サーバ側におけるHTTPのリダイレクト動作も不可(最初のHTTPアクセスが許可されない)
- ATSによるHTTPSへの自動変換は行われない
- 概要
- ATSの無効化
- アプリの設定ファイル(Info.plist)において、ATSの詳細設定が可能
必要となるSSLの条件
- SSLバージョン:TLS 1.2
- 補足
- 2015年9月時点における最新規定(1.3はドラフト)
- 補足
- 鍵交換アルゴリズム
- ECDHE (Elliptic Curve Diffie-Hellman key exchange, Ephemeral)
- 補足
- ATSではサポートされないForward Secrecy
- DHE (Diffie-Hellman key Exchange)
- ECDH (Elliptic curve Diffie–Hellman)
- ATSではサポートされないForward Secrecy
- SSL証明書
- 署名
- SHA256以上(SHA-2)
- 公開鍵の鍵長
- RSA:2048以上
- EC:256以上
- SSL証明書が適切に設定されていること
- SSL証明書エラーが発生した場合、通信を許さない
- 署名
- 対応する暗号スイート
- 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
Info.plist
- 全体
- NSAllowsArbitraryLoads:すべてのドメインに対して無効化(Default:false)
- 個別ドメイン
- <domain-name-for-exception-as-string>:制御するドメイン名
- NSExceptionMinimumTLSVersion: 要求するTLSバージョン(Default:TLS1.2)
- NSExceptionRequiresForwardSecrecy: ForwardSecrecyの要求(Default:ture)
- NSExceptionAllowsInsecureHTTPLoads: HTTPS(証明書等)エラー時の接続を許すか(Default:false)
- NSRequiresCertificateTransparency: 透かし入り証明書(Certificate Transparency)を要求するか(Default:false)
- NSIncludesSubdomains:本設定をサブドメインまで適用するか(Default:false)
- サードパーティ(他社ドメイン)用設定
- NSThirdPartyExceptionMinimumTLSVersion:要求するTSLバージョン
- NSThirdPartyExceptionRequiresForwardSecrecy:ForwardSecrecyの要求
- NSThirdPartyExceptionAllowsInsecureHTTPLoads:HTTPエラー時の接続を許すか
- <domain-name-for-exception-as-string>:制御するドメイン名
補足
- Forward Secrecy (前方秘匿性)
- SSL証明書の秘密鍵が漏洩しても、過去の通信に対する解読を不可能とすること
- Certificate Transparency (CT)
- SSL認証局が、SSL証明書にSCT(登録済み証明書タイムスタンプ)を付与すること。
- RFC6962
- http://www.certificate-transparency.org/known-logs