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 サポートに推奨される設定は次のとおりです。
代替構成オプション
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
は、HttpMessageHandler
Xamarin.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 つの方法があります。
- [プロジェクト オプション] で 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
– この環境変数は、使用する TLS ライブラリ (、、btls
legacy
またはdefault
) を宣言します (この変数を省略した場合と同じです)。XA_TLS_PROVIDER=btls
この環境変数は、プロジェクトに 環境ファイル を追加することによって設定されます。 環境ファイルは、 AndroidEnvironment のビルド アクションを含む Unix 形式のプレーンテキスト ファイルです。
環境変数と Xamarin.Android の詳細については、Xamarin.Android 環境 ガイドを参照してください。