Xamarin.iOS のアプリ トランスポート セキュリティ

App Transport Security (ATS) は、インターネット リソース (アプリのバックエンド サーバーなど) とアプリの間でセキュリティで保護された接続を強制します。

この記事では、App Transport Security が iOS 9 アプリに対して適用するセキュリティの変更と 、これが Xamarin.iOS プロジェクトに対してどのような意味を持つのかを紹介します。 ATS 構成オプション について説明し、必要に応じて ATS ATS をオプトアウト する方法について説明します。 ATS は既定で有効になっているため、セキュリティで保護されていないインターネット接続では、iOS 9 アプリで例外が発生します (明示的に許可していない限り)。

App Transport Security について

前述のように、ATS は、iOS 9 と OS X El Capitan のすべてのインターネット通信が安全な接続のベスト プラクティスに準拠していることを保証するため、アプリまたはライブラリを介して機密情報が誤って漏洩するのを防ぎます。

既存のアプリの場合は、可能な限りプロトコルを HTTPS 実装します。 新しい Xamarin.iOS アプリの場合は、インターネット リソースとの通信時にのみ使用 HTTPS する必要があります。 さらに、上位レベルの API 通信は、TLS バージョン 1.2 を使用して、前方秘密度で暗号化する必要があります。

NSUrlConnectionCFUrl、または NSUrlSession で行われた接続は、iOS 9 および OS X 10.11 (El Capitan) 用に構築されたアプリで既定で ATS を使用します。

既定の ATS 動作

iOS 9 および OS X 10.11 (El Capitan) 用に構築されたアプリでは ATS が既定で有効になっているため、 NSUrlConnectionCFUrl 、または NSUrlSession を使用するすべての接続は ATS セキュリティ要件の対象となります。 接続がこれらの要件を満たしていない場合は、例外が発生して失敗します。

ATS 接続の要件

ATS では、すべてのインターネット接続に対して次の要件が適用されます。

  • すべての接続暗号で前方秘密が使用されている必要があります。 受け入れ可能な暗号の一覧を以下で参照してください。
  • トランスポート層セキュリティ (TLS) プロトコルは、バージョン 1.2 以上である必要があります。
  • 2048 ビット以上の RSA キー、または 256 ビット以上の Elliptic-Curve (ECC) キーを持つ SHA256 フィンガープリントをすべての証明書に使用する必要があります。

ここでも、iOS 9 では ATS が既定で有効になっているため、これらの要件を満たさない接続を試みると、例外がスローされます。

ATS 互換暗号

ATS セキュリティで保護されたインターネット通信では、次の前方秘密暗号の種類が受け入れられます。

  • 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

iOS インターネット通信クラスの操作の詳細については、Apple の NSURLConnection クラス リファレンスCFURL リファレンス 、または NSURLSession クラス リファレンスを参照してください

Xamarin.iOS での ATS のサポート

ATS は iOS 9 と OS X El Capitan で既定で有効になっているため、Xamarin.iOS アプリまたはそれを使用しているライブラリまたはサービスがインターネットに接続する場合は、何らかのアクションを実行する必要があります。または、接続によって例外がスローされます。

既存のアプリの場合、Apple はできるだけ早くプロトコルを HTTPS サポートするよう提案します。 サポートされていないサード パーティの Web サービスに接続しているために接続できない場合、またはサポートHTTPSHTTPSが実用的でない場合は、ATS をオプトアウトできます。 詳細については、以下 の「ATS のオプトアウト 」セクションを参照してください。

新しい Xamarin.iOS アプリの場合は、インターネット リソースとの通信時にのみ使用 HTTPS する必要があります。 繰り返しますが、(サードパーティの Web サービスの使用など)、これが不可能であり、ATS をオプトアウトする必要がある場合があります。

さらに、ATS では、TLS バージョン 1.2 と前方秘密度を使用して、高レベルの API 通信を暗号化することが強制されます。 詳細については、上記の ATS 接続要件ATS 互換暗号 のセクションを参照してください。

TLS (トランスポート層セキュリティ) には慣れていない場合があります。これは SSL (Secure Socket Layer) の後継であり、ネットワーク接続経由でセキュリティを適用するための暗号化プロトコルのコレクションを提供します。

TLS レベルは、使用している Web サービスによって制御されるため、アプリの制御外です。 サーバーで HttpClient サポートされている ModernHttpClient 最高レベルの TLS 暗号化が自動的に使用されます。

通信しているサーバー (特にサード パーティサービスの場合) によっては、前方秘密を無効にするか、より低い TLS レベルを選択する必要があります。 詳細については、以下の 「ATS オプションの構成」 セクションを参照してください。

重要

App Transport Security は、 Managed HTTPClient 実装を使用する Xamarin アプリには適用されません。 これは、CFNetwork HTTPClient 実装 または NSURLSession HTTPClient 実装 のみを使用する接続に適用されます。

HTTPClient 実装の設定

iOS アプリで使用される HTTPClient 実装を設定するには、ソリューション エクスプローラーProjectをダブルクリックして、Project オプションを開きます。 iOS ビルドに移動し、HttpClient 実装ドロップダウンで目的のクライアントの種類を選択します。

Setting the iOS Build Options

マネージド ハンドラー

マネージド ハンドラーは、Xamarin.iOS の以前のバージョンに付属しているフル マネージド HttpClient ハンドラーであり、既定のハンドラーです。

長所:

  • これは、Microsoft .NET および古いバージョンの Xamarin と最も互換性があります。

短所:

  • iOS と完全に統合されていません (たとえば、TLS 1.0 に制限されています)。
  • 通常、ネイティブ API よりもはるかに低速です。
  • より多くのマネージド コードが必要になり、より大きなアプリが作成されます。

CFNetwork ハンドラー

CFNetwork ベースのハンドラーは、ネイティブ CFNetwork フレームワークに基づいています。

長所:

  • パフォーマンスを向上させ、実行可能ファイルサイズを小さくするためにネイティブ API を使用します。
  • TLS 1.2 などの新しい標準のサポートを追加します。

短所:

  • iOS 6 以降が必要です。
  • watchOS では使用できません。
  • 一部の HttpClient の機能とオプションは使用できません。

NSUrlSession ハンドラー

NSUrlSession ベースのハンドラーは、ネイティブ NSUrlSession API に基づいています。

長所:

  • パフォーマンスを向上させ、実行可能ファイルサイズを小さくするためにネイティブ API を使用します。
  • TLS 1.2 などの新しい標準のサポートを追加します。

短所:

  • iOS 7 以降が必要です。
  • 一部の HttpClient の機能とオプションは使用できません。

ATS の問題の診断

インターネット (iOS 9 の直接または Web ビュー) に接続しようとすると、次の形式でエラーが発生する可能性があります。

App Transport Security は安全でないため、クリアテキスト HTTP (http://www.-the-blocked-domain.com) リソースの読み込みをブロックしました。 一時的な例外は、アプリの Info.plist ファイルを使用して構成できます。

iOS9 では、App Transport Security (ATS) によって、インターネット リソース (アプリのバックエンド サーバーなど) とアプリの間でセキュリティで保護された接続が強制されます。 さらに、ATS ではプロトコルを使用した HTTPS 通信と、TLS バージョン 1.2 を使用した高度な API 通信を前方秘密度で暗号化する必要があります。

ATS は iOS 9 および OS X 10.11 (El Capitan) 用に構築されたアプリで既定で有効になっているため、すべての接続で ATS を使用 NSURLConnectionするか、 CFURL ATS NSURLSession のセキュリティ要件に従います。 接続がこれらの要件を満たしていない場合は、例外が発生して失敗します。

Apple には、コンパイル (または必要に応じて Xamarin と C# にトランスコード) でき、ATS/TLS の問題の診断に使用できる TLSTool サンプル アプリ も用意されています。 この問題を解決する方法については、以下 の「ATS のオプトアウト 」セクションを参照してください。

ATS オプションの構成

ATS のいくつかの機能を構成するには、アプリの Info.plist ファイルで特定のキーの値を設定します。 ATS を制御するには、次のキーを使用できます (入れ子になっている方法を示すためにインデントされます)。

NSAppTransportSecurity
    NSAllowsArbitraryLoads
    NSAllowsArbitraryLoadsInWebContent
    NSExceptionDomains
    <domain-name-for-exception-as-string>
        NSExceptionMinimumTLSVersion
        NSExceptionRequiresForwardSecrecy
        NSExceptionAllowsInsecureHTTPLoads
        NSRequiresCertificateTransparency
        NSIncludesSubdomains
        NSThirdPartyExceptionMinimumTLSVersion
        NSThirdPartyExceptionRequiresForwardSecrecy
        NSThirdPartyExceptionAllowsInsecureHTTPLoads

各キーの種類と意味は次のとおりです。

  • NSAppTransportSecurity (Dictionary) - ATS のすべての設定キーと値が含まれます。
  • NSAllowsArbitraryLoads (Boolean) - に記載NSExceptionDomainsされていないドメインで ATS が無効になる場合YES。 一覧表示されたドメインの場合は、指定されたセキュリティ設定が使用されます。
  • NSAllowsArbitraryLoadsInWebContent (Boolean) - Apple Transport Security (ATS) 保護がアプリの残りの部分で引き続き有効になっている間に Web ページが正しく読み込まれる場合 YES
  • NSExceptionDomains (Dictionary) - 特定のドメインに ATS が使用する必要があるドメインとセキュリティ設定のコレクション。
  • <domain-name-for-exception-as-string> (Dictionary) - 特定のドメイン (例: ) の例外のコレクション。 www.xamarin.com
  • NSExceptionMinimumTLSVersion (String) - 最小限の TLS バージョン (既定値TLSv1.2) のいずれかまたはいずれかとしてTLSv1.0TLSv1.1
  • NSExceptionRequiresForwardSecrecy (Boolean) - ドメインが前方セキュリティで暗号を使用する必要がない場合 NO 。 既定値は YES です。
  • NSExceptionAllowsInsecureHTTPLoads (Boolean) - このドメインとの通信がすべてプロトコルにHTTPS含まれている必要がある場合 NO (既定)。
  • NSRequiresCertificateTransparency (Boolean) - ドメインの Secure Sockets Layer (SSL) に有効な透過性データを含める必要がある場合 YES 。 既定値は NO です。
  • NSIncludesSubdomains (Boolean) - これらの設定がこのドメインのすべてのサブドメインをオーバーライドする場合 YES 。 既定値は NO です。
  • NSThirdPartyExceptionMinimumTLSVersion (String) - ドメインが開発者のコントロール外のサード パーティ サービスである場合に使用される TLS バージョン。
  • NSThirdPartyExceptionRequiresForwardSecrecy (Boolean) - サード パーティ ドメインで前方秘密が必要な場合 YES
  • NSThirdPartyExceptionAllowsInsecureHTTPLoads (Boolean) - ATS がサード パーティ ドメインとのセキュリティで保護されていない通信を許可する場合 YES

ATS のOpting-Out

Apple はプロトコルを使用し、インターネットベースの HTTPS 情報への通信をセキュリティで保護することを強くお勧めしますが、これが常に可能であるとは限らない場合があります。 たとえば、サードパーティの Web サービスと通信している場合や、アプリでインターネット配信広告を使用している場合などです。

Xamarin.iOS アプリが安全でないドメインに対して要求を行う必要がある場合、アプリの Info.plist ファイルに対する次の変更により、ATS が特定のドメインに対して適用するセキュリティの既定値が無効になります。

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>www.the-domain-name.com</key>
        <dict>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.0</string>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

Visual Studio for Mac内で、ソリューション エクスプローラーのファイルをダブルクリックしInfo.plist、[ソース] ビューに切り替えて、上記のキーを追加します。

The Source view of the Info.plist file after adding specified keys.

アプリがセキュリティで保護されていないサイトから Web コンテンツを読み込んで表示する必要がある場合は、アプリの Info.plist ファイルに次を追加して、Apple Transport Security (ATS) 保護がアプリの残りの部分で引き続き有効になっている間に Web ページが正しく読み込まれるようします。

<key>NSAppTransportSecurity</key>
<dict>
    <key> NSAllowsArbitraryLoadsInWebContent</key>
    <true/>
</dict>

必要に応じて、アプリの Info.plist ファイルに次の変更を加えて、すべてのドメインとインターネット通信の ATS を完全に無効にすることができます。

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

Visual Studio for Mac内で、ソリューション エクスプローラーのファイルをダブルクリックしInfo.plist、[ソース] ビューに切り替えて、上記のキーを追加します。

The Source view of the Info.plist file after specifying NSAllowsArbitraryLoadsInWebContent and NSAllowsArbitraryLoads.

重要

アプリケーションで安全でない Web サイトへの接続が必要な場合は、ATS を完全にオフにするのではなく、例外NSExceptionDomainsとして常にドメインをNSAllowsArbitraryLoads入力する必要があります。 NSAllowsArbitraryLoads は、極端な緊急時にのみ使用する必要があります。

ここでも、ATS の無効化は、セキュリティで保護された接続への切り替えが利用できないか、実用的でない場合 にのみ 、最後の手段として使用する必要があります。

まとめ

この記事では、App Transport Security (ATS) を紹介し、インターネットとのセキュリティで保護された通信を適用する方法について説明しました。 まず、iOS 9 で実行されている Xamarin.iOS アプリに対して ATS が必要とする変更について説明しました。 その後、ATS の機能とオプションの制御について説明しました。 最後に、Xamarin.iOS アプリでの ATS のオプトアウトについて説明しました。