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

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

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

アプリ トランスポート セキュリティについて

前述のように、ATS は、iOS 9 と OS X El Capitan のすべてのインターネット通信がセキュリティで保護された接続のベスト プラクティスに準拠していることを保証するため、アプリまたは使用しているライブラリを介して機密情報が誤って開示されるのを防ぎます。

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

NSUrlConnection、CFUrl、または 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 キーを持つ SHA256 フィンガープリント、または 256 ビット以上の楕円曲線 (ECC) キーをすべての証明書に使用する必要があります。

繰り返しますが、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 クラス リファレンスまたは NSURLSession クラス リファレンスを参照してください。

Xamarin.iOS での ATS のサポート

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

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

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

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

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

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

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

重要

アプリ トランスポート セキュリティは、Managed HTTPClient 実装を使用する Xamarin アプリには適用されません。 CFNetwork HTTPClient 実装または NSURLSession HTTPClient 実装のみを使用した接続に適用されます。

HTTPClient 実装の設定

iOS アプリで使用される HTTPClient 実装を設定するには、ソリューション エクスプローラーで 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 ビューからインターネットに接続しようとすると、次の形式でエラーが発生する可能性があります。

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

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

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

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

ATS オプションの構成

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

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

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

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

ATS のオプトアウト

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

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

<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 ファイルに次の変更を加えて、すべての doメイン とインターネット通信の 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 を完全にオフにするのではなく、常にNSAllowsArbitraryLoads例外NSExceptionDomainsとして doメイン を入力する必要がありますNSAllowsArbitraryLoads は、極端な緊急時にのみ使用する必要があります。

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

まとめ

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