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
を調整するには:
- ソリューション エクスプローラーでプロジェクト名をダブルクリックし、[プロジェクト オプション] を開きます。
- プロジェクトのビルド設定に切り替えます (たとえば、Xamarin.iOS アプリの iOS ビルド)。
- [HttpClient 実装] ドロップダウンから、[NSUrlSession] (推奨)、[CFNetwork]、または [マネージド] のいずれかとして
HttpClient
型を選択します。
ヒント
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 が既定で有効になっているため、NSUrlConnection
、CFUrl
、または NSUrlSession
を使用するすべての接続は ATS セキュリティ要件の対象となります。 接続がこれらの要件を満たしていない場合、例外が発生して失敗します。
HttpClient スタックと SSL/TLS 実装の選択に基づいて、ATS で正しく動作するようにアプリを変更する必要がある場合があります。
ATS の詳細については、アプリ トランスポート セキュリティに関するガイドを参照してください。
既知の問題
このセクションでは、Xamarin.iOS での TLS サポートに関する既知の問題について説明します。
要求された値 AppleTLS が見つからなかったことを示すエラーでプロジェクトの読み込みに失敗する
Xamarin.iOS 9.8 では、Xamarin.iOS アプリケーション用の .csproj ファイルを含む新しい設定がいくつか導入されました。 これらの変更により、プロジェクトが古いバージョンの Xamarin.iOS で開かれると、問題が発生する可能性があります。 次のスクリーンショットは、このシナリオで表示される可能性があるエラー メッセージの例です。
このエラーは、Xamarin.iOS 9.8 でプロジェクト ファイルに MtouchTlsProvider
設定が導入されたことが原因で発生します。 Xamarin.iOS 9.8 (またはそれ以降) に更新できない場合は、.csproj ファイル アプリケーションを手動で編集し、MtouchTlsprovider
要素を削除してから、変更したプロジェクト ファイルを保存します。
次のスニペットは、MtouchTlsProvider
が .csproj ファイル内でどのように見えるかの例です。
<MtouchTlsProvider>Default</MtouchTlsProvider>