iOS/macOS 用の HttpClient と SSL/TLS の実装セレクター

Xamarin.iOS、Xamarin.tvOS、Xamarin.Mac 用 の HttpClient 実装セレクター は、使用する HttpClient 実装を制御します。 iOS、tvOS、または macOS ネイティブ トランスポート (NSUrlSession または CFNetworkOS によっては) を使用する実装に切り替えることができます。 アップサイドは、TLS 1.2 のサポート、小さいバイナリ、高速なダウンロードです。欠点は、非同期操作を実行するためにイベント ループを実行する必要があるということです。

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

警告

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

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

HttpClient スタックの選択

アプリで HttpClient 使用される内容を調整するには:

  1. ソリューション エクスプローラーでProject名をダブルクリックして、Project オプションを開きます。
  2. プロジェクトの ビルド 設定に切り替えます (たとえば、Xamarin.iOS アプリの iOS ビルド )。
  3. [HttpClient 実装] ドロップダウンから、NSUrlSession (推奨)、CFNetwork、または Managed のいずれかとして型を選択HttpClientします。

Choose HttpClient implementation from Managed, CFNetwork, or NSUrlSession

ヒント

TLS 1.2 の場合は、オプションを NSUrlSession 使用することをお勧めします。

NSUrlSession

NSURLSessionベースのハンドラーは、iOS 7 以降で使用できるネイティブ NSURLSession フレームワークに基づいています。 これは推奨される設定です。

長所

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

短所

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

CFNetwork

ベースの CFNetworkハンドラーは、iOS 6 以降で使用できるネイティブ CFNetwork フレームワークに基づいています。

長所

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

短所

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

マネージド

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

長所

  • Microsoft .NET および古い Xamarin バージョンと最も互換性のある機能セットがあります。

短所

  • これは Apple OS と完全に統合されておらず、TLS 1.0 に制限されています。 今後、セキュリティで保護された Web サーバーまたはクラウド サービスに接続できない可能性があります。
  • 通常、ネイティブ API よりも暗号化などの処理がはるかに遅くなります。
  • より多くのマネージド コードが必要になるため、より大きなアプリを配布可能にできます。

プログラムによって HttpMessageHandler を設定する

上記のプロジェクト全体の構成に加えて、次のコード スニペットで示すように、コンストラクターを使用して必要HttpMessageHandlerなインスタンスをHttpClientインスタンス化して挿入することもできます。

// This will use the default message handler for the application; as
// set in the Project Options for the project.
HttpClient client = new HttpClient();

// This will create an HttpClient that explicitly uses the CFNetworkHandler
HttpClient client = new HttpClient(new CFNetworkHandler());

// This will create an HttpClient that explicitly uses NSUrlSessionHandler
HttpClient client = new HttpClient(new NSUrlSessionHandler());

これにより、Project オプション ダイアログで宣言されているものとは異なるHttpMessageHandler方法を使用できます。

SSL/TLS の実装

SSL (Secure Socket Layer) とその後続の TLS (トランスポート層セキュリティ) は、HTTP やその他のネットワーク接続を経由してサポートします System.Net.Security.SslStream。 Xamarin.iOS、Xamarin.tvOS、または Xamarin.Mac の System.Net.Security.SslStream 実装では、Mono によって提供されるマネージド実装を使用する代わりに、Apple のネイティブ SSL/TLS 実装が呼び出されます。 Apple のネイティブ実装では、TLS 1.2 がサポートされています。

警告

今度の Xamarin.Mac 4.8 リリースでは、macOS 10.9 以降のみをサポートします。 以前のバージョンの Xamarin.Mac では macOS 10.7 以降をサポートしていましたが、これらの古い macOS バージョンは TLS 1.2 をサポートするための十分な TLS インフラストラクチャがありませんでした。 macOS 10.7 または macOS 10.8 をターゲットにするには、Xamarin.Mac 4.6 以前を使用してください。

アプリケーション トランスポート セキュリティ

Apple の App Transport Security (ATS) は、インターネット リソース (アプリのバックエンド サーバーなど) とアプリの間でセキュリティで保護された接続を強制します。 ATS により、すべてのインターネット通信がセキュリティで保護された接続のベスト プラクティスに準拠することが保証されるため、アプリまたは使用しているライブラリを介して機密情報が直接誤って開示されるのを防ぐことができます。

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

HttpClient スタックと SSL/TLS 実装の選択に基づいて、ATS で正しく動作するようにアプリを変更する必要がある場合があります。

ATS の詳細については、 アプリ トランスポート セキュリティ ガイドを参照してください。

既知の問題

このセクションでは、Xamarin.iOS での TLS サポートに関する既知の問題について説明します。

Project "要求された値 AppleTLS が見つかりませんでした" というエラーで読み込めませんでした

Xamarin.iOS 9.8 では、Xamarin.iOS アプリケーションの .csproj ファイルが含まれる新しい設定がいくつか導入されました。 これらの変更により、プロジェクトが古いバージョンの Xamarin.iOS で開かれると、問題が発生する可能性があります。 次のスクリーンショットは、このシナリオで表示される可能性があるエラー メッセージの例です。

Screenshot of error while trying to load project, requested value legacy not found

このエラーは、Xamarin.iOS 9.8 でプロジェクト ファイルに設定が導入 MtouchTlsProvider された場合に発生します。 Xamarin.iOS 9.8 (またはそれ以降) に更新できない場合は、 .csproj ファイル アプリケーションを手動で編集し、要素を MtouchTlsprovider 削除してから、変更したプロジェクト ファイルを保存します。

次の MtouchTlsProvider スニペットは、 .csproj ファイル内の設定の例です。

<MtouchTlsProvider>Default</MtouchTlsProvider>