Android 用 HttpClient Stack と SSL/TLS 実装セレクター

HttpClient Stack と SSL/TLS 実装セレクターは、Xamarin.Android アプリで使用される HttpClient と SSL/TLS の実装を決定します。

プロジェクトは System.Net.Http アセンブリを参照する必要があります。

警告

2018 年 4 月 – PCI コンプライアンスを含むセキュリティ要件の増加により、主要なクラウド プロバイダーと Web サーバーは、1.2 より古い TLS バージョンのサポートを停止する予定です。 以前のバージョンの Visual Studio で作成された Xamarin プロジェクトでは、既定で古いバージョンの TLS が使用されます。

アプリが引き続きこれらのサーバーとサービスで動作するようにするには、次に示す と Native TLS 1.2 の設定を使用して Xamarin プロジェクトAndroid HttpClientを更新してから、アプリを再ビルドしてユーザーに再展開する必要があります

Xamarin.Android HttpClient の構成は、[プロジェクト オプション] [Android オプション] >で、[詳細オプション] ボタンをクリックします。

TLS 1.2 サポートに推奨される設定は次のとおりです。

Visual Studio Android のオプション

代替構成オプション

AndroidClientHandler

AndroidClientHandler は、マネージド コードですべてを実装する代わりに、ネイティブ Java/OS コードに委任する新しいハンドラーです。 このオプションを選択することをお勧めします。

長所

  • ネイティブ API を使用すると、パフォーマンスが向上し、実行可能ファイルのサイズが小さくなります。
  • 最新の標準 (例: ) のサポート。 TLS 1.2。

短所

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

Managed (HttpClientHandler)

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

長所

  • これは、MS .NET および古い Xamarin バージョンと最も互換性のある (機能) です。

短所

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

ハンドラーの選択

HttpClientHandler の選択AndroidClientHandlerは、アプリケーションのニーズによって異なります。 AndroidClientHandler は、最新のセキュリティ サポート (例: ) に推奨されます。

  • TLS 1.2 以降のサポートが必要です。
  • アプリのターゲットは Android 4.1 (API 16) 以降です。
  • に対する TLS 1.2 以降の HttpClientサポートが必要です。
  • に対する TLS 1.2 以降の WebClientサポートは必要ありません。

HttpClientHandler TLS 1.2 以降のサポートが必要ですが、Android 4.1 より前のバージョンの Android をサポートする必要がある場合は、これが適しています。 また、 の TLS 1.2 以降のサポートが必要な場合にも適しています WebClient

Xamarin.Android 8.3 以降では、基になる TLS プロバイダーとして、 HttpClientHandler 既定で Boring SSL (btls) が使用されます。 ボーリング SSL TLS プロバイダーには、次の利点があります。

  • TLS 1.2 以降がサポートされています。
  • すべての Android バージョンがサポートされています。
  • と の両方 HttpClient に対して TLS 1.2 以降のサポートが WebClient提供されます。

下取り TLS プロバイダーとしてボーリング SSL を使用する欠点は、結果として得られる APK のサイズを大きくできることです (サポートされている ABI ごとに約 1 MB の追加 APK サイズが追加されます)。

Xamarin.Android 8.3 以降、既定の TLS プロバイダーは Boring SSL (btls) です。 Boring SSL を使用しない場合は、 プロパティを に設定することで、マネージド SSL の過去の実装にlegacy戻すことができます (ビルド プロパティの設定$(AndroidTlsProvider)の詳細については、「ビルド プロセス」を参照してください)。

プログラムによる使用 AndroidClientHandler

Xamarin.Android.Net.AndroidClientHandlerは、HttpMessageHandlerXamarin.Android 専用の実装です。 このクラスのインスタンスは、すべての HTTP 接続にネイティブ java.net.URLConnection 実装を使用します。 これにより、理論的には、HTTP パフォーマンスが向上し、APK サイズが小さくなります。

このコード スニペットは、 クラスの 1 つのインスタンスに対して明示的に実行する方法の HttpClient 例です。

// Android 4.1 or higher, Xamarin.Android 6.1 or higher
HttpClient client = new HttpClient(new Xamarin.Android.Net.AndroidClientHandler ());

注意

基になる Android デバイスでは、TLS 1.2 (つまり、Android 4.1 以降)。 TLS 1.2 の公式サポートは Android 5.0 以降にあります。 ただし、一部のデバイスでは、Android 4.1 以降で TLS 1.2 がサポートされています。

SSL/TLS 実装ビルド オプション

このプロジェクト オプションは、 と の両方 HttpClient のすべての Web 要求で使用される基になる TLS ライブラリを WebRequest制御します。 既定では、TLS 1.2 が選択されています。

次に例を示します。

var client = new HttpClient();

HttpClient 実装が Managed に設定され、TLS 実装が ネイティブ TLS 1.2 以降に設定されている場合、 client オブジェクトは自動的にマネージド HttpClientHandler と TLS 1.2 (BoringSSL ライブラリによって提供) を HTTP 要求に使用します。

ただし、 HttpClient 実装 が に AndroidHttpClient設定されている場合、すべての HttpClient オブジェクトは基になる Java クラス java.net.URLConnection を使用し、 TLS/SSL 実装 値の影響を受けません。 WebRequest オブジェクトは、BoringSSL ライブラリを使用します。

SSL/TLS 構成を制御するその他の方法

Xamarin.Android アプリケーションで TLS 設定を制御するには、次の 3 つの方法があります。

  1. [プロジェクト オプション] で HttpClient 実装と既定の TLS ライブラリを選択します。
  2. をプログラムで使用します Xamarin.Android.Net.AndroidClientHandler
  3. 環境変数を宣言します (省略可能)。

3 つの選択肢のうち、Xamarin.Android プロジェクト オプションを使用して、アプリ全体の既定 HttpMessageHandler と TLS を宣言することをお勧めします。 その後、必要に応じて、プログラムによってオブジェクトを Xamarin.Android.Net.AndroidClientHandler インスタンス化します。 これらのオプションについては、上で説明します。

環境変数を使用する 3 番目のオプションを以下に説明します。

環境変数を宣言する

Xamarin.Android での TLS の使用に関連する 2 つの環境変数があります。

  • XA_HTTP_CLIENT_HANDLER_TYPE – この環境変数は、アプリケーションで使用される既定値 HttpMessageHandler を宣言します。 次に例を示します。

    XA_HTTP_CLIENT_HANDLER_TYPE=Xamarin.Android.Net.AndroidClientHandler
    
  • XA_TLS_PROVIDER– この環境変数は、使用する TLS ライブラリ (、、btlslegacyまたは default ) を宣言します (この変数を省略した場合と同じです)。

    XA_TLS_PROVIDER=btls
    

この環境変数は、プロジェクトに 環境ファイル を追加することによって設定されます。 環境ファイルは、 AndroidEnvironment のビルド アクションを含む Unix 形式のプレーンテキスト ファイルです。

環境変数と Xamarin.Android の詳細については、Xamarin.Android 環境 ガイドを参照してください。