Android 用の HttpClient スタックと SSL/TLS の実装セレクター
HttpClient スタックと SSL/TLS 実装セレクターは、Xamarin.Android アプリで使用される HttpClient および SSL/TLS 実装を決定します。
プロジェクトは、System.Net.Http アセンブリを参照する必要があります。
警告
2018 年 4 月 – PCI コンプライアンスを含むセキュリティ要件の増加により、主要なクラウド プロバイダーと Web サーバーは、1.2 より古い TLS バージョンのサポートを停止する予定です。 以前のバージョンの Visual Studio で作成された Xamarin プロジェクトでは、既定で古いバージョンの TLS が使用されます。
アプリが引き続きこれらのサーバーやサービスで動作するようにするには、次に示す Android HttpClient
および Native TLS 1.2
の設定で Xamarin プロジェクトを更新し、ユーザーにアプリをビルドし直して再デプロイする必要があります。
Xamarin.Android HttpClient の構成は、[プロジェクト オプション] > [Android オプション] に移動し、[詳細オプション] ボタンをクリックします。
TLS 1.2 のサポートで推奨される設定は次のとおりです。
代わりの構成オプション
AndroidClientHandler
AndroidClientHandler は、マネージド コードですべてを実装するのではなく、ネイティブ Java/OS コードにデリゲートする新しいハンドラーです。 このオプションを選択することをお勧めします。
長所
- ネイティブ API を使用することで、パフォーマンスを向上させ、実行可能ファイルのサイズを小さくします。
- 次のような最新の標準をサポートします。 例: TLS 1.2。
デメリット
- Android 4.1 以降が必要です。
- 一部の HttpClient の機能/オプションは使用できません。
マネージド (HttpClientHandler)
マネージド ハンドラーは、以前のバージョンの Xamarin.Android に付属しているフル マネージド HttpClient ハンドラーです。
長所
- これは、MS .NET および以前のバージョンの Xamarin と最も互換性 (機能) があります。
デメリット
- OS と完全には統合されていません (例: TLS 1.0 に制限)。
- 通常、ネイティブ API よりもはるかに低速 (暗号化など) です。
- より多くのマネージド コードが必要になり、より大きなアプリケーションが作成されます。
ハンドラーの選択
AndroidClientHandler
と HttpClientHandler
のどちらを選択するかは、アプリケーションのニーズによって異なります。 AndroidClientHandler
は、次のような最新のセキュリティ サポートに推奨されます。
- 例: TLS 1.2 以降のサポートが必要です。
- アプリは、Android 4.1 (API 16) 以降を対象としています。
HttpClient
には、TLS 1.2 以降のサポートが必要です。WebClient
には、TLS 1.2 以降のサポートは必要ありません。
HttpClientHandler
には TLS 1.2 以降のサポートが必要ですが、Android 4.1 以前のバージョンの Android をサポートする必要がある場合にお勧めします。 WebClient
の TLS 1.2 以降のサポートが必要な場合にもお勧めします。
Xamarin.Android 8.3 (HttpClientHandler
) 以降では、基になる TLS プロバイダーとして、既定で Boring SSL (btls
) が使用されます。 Boring SSL TLS プロバイダーには、次のような利点があります。
- TLS 1.2 以降をサポートしています。
- すべての Android バージョンをサポートしています。
HttpClient
とWebClient
の両方で TLS 1.2 以降をサポートしています。
Boring TLS プロバイダーとして Boring SSL を使用する場合の欠点は、結果として得られる APK のサイズが大きくなることです (サポートされている ABI ごとに約 1 MB の APK サイズが追加されます)。
Xamarin.Android 8.3 以降、既定の TLS プロバイダーは Boring SSL (btls
) です。 Boring SSL を使用しない場合は、$(AndroidTlsProvider)
プロパティを legacy
に設定することで、過去のマネージド SSL 実装に戻すことができます (ビルド プロパティの設定の詳細については、「ビルド プロセス」を参照してください)。
プログラムによる AndroidClientHandler
の使用
Xamarin.Android.Net.AndroidClientHandler
は、Xamarin.Android 専用の HttpMessageHandler
の実装です。
このクラスのインスタンスは、すべての HTTP 接続にネイティブ java.net.URLConnection
実装を使用します。 これにより、理論的には HTTP パフォーマンスが向上し、APK サイズが小さくなります。
このコード スニペットは、HttpClient
クラスの単一のインスタンスに対して明示的に指定する方法の例です。
// Android 4.1 or higher, Xamarin.Android 6.1 or higher
HttpClient client = new HttpClient(new Xamarin.Android.Net.AndroidClientHandler ());
Note
基になる Android デバイスが TLS 1.2 (例: Android 4.1 以降) をサポートしている必要があります。 TLS 1.2 の公式サポートは Android 5.0 以降であることに注意してください。 ただし、Android 4.1 以降で TLS 1.2 をサポートしているデバイスもあります。
SSL/TLS 実装のビルド オプション
このプロジェクト オプションは、HttpClient
と WebRequest
の両方のすべての Web 要求で使用される、基になる TLS ライブラリを制御します。 既定では、TLS 1.2 が選択されています。
次に例を示します。
var client = new HttpClient();
HttpClient 実装が [マネージド] に設定され、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 つの方法があります。
- プロジェクト オプションで HttpClient 実装と既定の TLS ライブラリを選択します。
- プログラムで
Xamarin.Android.Net.AndroidClientHandler
を使用します。 - 環境変数を宣言します (省略可能)。
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
- この環境変数は、btls
、legacy
、default
(この変数を省略した場合と同じです) のどの TLS ライブラリを使用するかを宣言します。XA_TLS_PROVIDER=btls
この環境変数は、プロジェクトに環境ファイルを追加することによって設定されます。 環境ファイルは、AndroidEnvironment のビルド アクションを含む Unix 形式のプレーンテキスト ファイルです。
環境変数と Xamarin.Android の詳細については、Xamarin.Android 環境に関するガイドを参照してください。