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

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

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

警告

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

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

HttpClient スタックの選択

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

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

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

// 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());

これにより、[プロジェクト オプション] ダイアログで宣言されているものとは異なる HttpMessageHandler を使用できるようになります。

SSL/TLS の実装

SSL (Secure Socket Layer) とその後継の TLS (トランスポート層セキュリティ) により、System.Net.Security.SslStream を介した HTTP やその他のネットワーク接続がサポートされます。 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 は、すべてのインターネット通信がセキュリティで保護された接続のベスト プラクティスに準拠していることを保証し、アプリまたは使用しているライブラリを介して偶発的に直接機密情報が漏えいすることを防ぎます。

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

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

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

既知の問題

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

要求された値 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>