Xamarin.iOS のアプリ トランスポート セキュリティ
アプリ トランスポート セキュリティ (ATS) は、インターネット リソース (アプリのバックエンド サーバーなど) とアプリの間にセキュリティで保護された接続を強制します。
この記事では、App Transport Security が iOS 9 アプリに適用するセキュリティの変更と、Xamarin.iOS プロジェクトに対してこれが何を意味するかについて説明します。ATS 構成オプションについて説明し、必要に応じて ATS ATS をオプトアウトする方法について説明します。 ATS は既定で有効になっているため、セキュリティで保護されていないインターネット接続では、(明示的に許可していない限り) iOS 9 アプリで例外が発生します。
アプリ トランスポート セキュリティについて
前述のように、ATS は、iOS 9 と OS X El Capitan のすべてのインターネット通信がセキュリティで保護された接続のベスト プラクティスに準拠していることを保証するため、アプリまたは使用しているライブラリを介して機密情報が誤って開示されるのを防ぎます。
既存のアプリの場合は、可能な限りプロトコルを HTTPS
実装します。 新しい Xamarin.iOS アプリの場合は、インターネット リソースとの通信時にのみ使用 HTTPS
する必要があります。 さらに、高度な API 通信は、TLS バージョン 1.2 と前方秘密を使用して暗号化する必要があります。
NSUrlConnection、CFUrl、または NSUrlSession で行われた接続は、iOS 9 および OS X 10.11 (El Capitan) 用に構築されたアプリで既定で ATS を使用します。
既定の ATS 動作
iOS 9 および OS X 10.11 (El Capitan) 用に構築されたアプリでは ATS が既定で有効なため、NSUrlConnection、CFUrl、または NSUrlSession を使うすべての接続は ATS セキュリティ要件の対象となります。 接続がこれらの要件を満たしていない場合、例外が発生して失敗します。
ATS 接続の要件
ATS では、すべてのインターネット接続に次の要件が適用されます。
- すべての接続暗号は、前方秘密を使用している必要があります。 受け入れ可能な暗号の一覧を次に示します。
- トランスポート層セキュリティ (TLS) プロトコルは、バージョン 1.2 以上である必要があります。
- 2048 ビット以上の RSA キーを持つ SHA256 フィンガープリント、または 256 ビット以上の楕円曲線 (ECC) キーをすべての証明書に使用する必要があります。
繰り返しますが、iOS 9 では ATS が既定で有効になっているため、これらの要件を満たさない接続を試みると、例外がスローされます。
ATS 互換暗号
ATS セキュリティで保護されたインターネット通信では、次の前方秘密暗号の種類が受け入れられます。
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
iOS インターネット通信クラスの操作の詳細については、Apple の NSURLConnection クラス リファレンスまたは NSURLSession クラス リファレンスを参照してください。
Xamarin.iOS での ATS のサポート
iOS 9 および OS X El Capitan では ATS が既定で有効になっているため、Xamarin.iOS アプリまたは使用しているライブラリまたはサービスがインターネットに接続する場合は、何らかのアクションを実行する必要があります。そうしないと、接続によって例外がスローされます。
既存のアプリの場合、Apple はできるだけ早くプロトコルを HTTPS
サポートするよう提案しています。 サポートされていないサード パーティの Web サービスに接続しているために接続できない場合、またはサポートHTTPS
HTTPS
が実用的でない場合は、ATS をオプトアウトできます。 詳細については、 後述の「ATS のオプトアウト」セクションを参照してください。
新しい Xamarin.iOS アプリの場合は、インターネット リソースと通信するときに排他的に使用 HTTPS
する必要があります。 ここでも、これが不可能であり、ATS をオプトアウトする必要がある状況 (サード パーティの Web サービスの使用など) がある可能性があります。
さらに、ATS では、TLS バージョン 1.2 を使用して高度な API 通信を暗号化し、前方秘密を使用して適用します。 詳細については、上記の ATS 接続要件 と ATS 互換暗号 のセクションを参照してください。
TLS (トランスポート層セキュリティ) に慣れていないかもしれませんが、これは SSL (Secure Socket Layer) の後継であり、ネットワーク接続経由でセキュリティを適用するための暗号化プロトコルのコレクションを提供します。
TLS レベルは、使用している Web サービスによって制御されるため、アプリの制御外です。 サーバーでHttpClient
ModernHttpClient
サポートされている最高レベルの TLS 暗号化が自動的に使用されます。
通信しているサーバー (特にサード パーティのサービスの場合) によっては、前方秘密を無効にするか、より低い TLS レベルを選択することが必要になる場合があります。 詳細については、後述の 「ATS オプションの構成」 セクションを参照してください。
重要
アプリ トランスポート セキュリティは、Managed HTTPClient 実装を使用する Xamarin アプリには適用されません。 CFNetwork HTTPClient 実装または NSURLSession HTTPClient 実装のみを使用した接続に適用されます。
HTTPClient 実装の設定
iOS アプリで使用される HTTPClient 実装を設定するには、ソリューション エクスプローラーで Project をダブルクリックしてプロジェクト オプションを開きます。 iOS ビルドに移動し、[HttpClient 実装] ドロップダウンで目的のクライアントの種類を選択します。
マネージド ハンドラー
マネージド ハンドラーは、Xamarin.iOS の以前のバージョンに付属しているフル マネージド HttpClient ハンドラーであり、既定のハンドラーです。
長所:
- これは、Microsoft .NET および以前のバージョンの Xamarin と最も互換性があります。
短所:
- iOS と完全には統合されていません (たとえば、TLS 1.0 に制限されています)。
- 通常、ネイティブ API よりもはるかに低速です。
- より多くのマネージド コードが必要になり、より大きなアプリが作成されます。
CFNetwork ハンドラー
CFNetwork ベースのハンドラーは、ネイティブ CFNetwork
フレームワークに基づいています。
長所:
- ネイティブ API を使用して、パフォーマンスを向上させ、実行可能ファイルのサイズを小さくします。
- TLS 1.2 などの新しい標準のサポートを追加します。
短所:
- iOS 6 以降が必要です。
- watchOS では使用できません。
- 一部の HttpClient の機能とオプションは使用できません。
NSUrlSession ハンドラー
NSUrlSession ベースのハンドラーは、ネイティブ NSUrlSession
API に基づいています。
長所:
- ネイティブ API を使用して、パフォーマンスを向上させ、実行可能ファイルのサイズを小さくします。
- TLS 1.2 などの新しい標準のサポートを追加します。
短所:
- iOS 7 以降が必要です。
- 一部の HttpClient の機能とオプションは使用できません。
ATS の問題の診断
iOS 9 で直接または Web ビューからインターネットに接続しようとすると、次の形式でエラーが発生する可能性があります。
アプリ トランスポート セキュリティは安全でないため、クリアテキスト HTTP (
http://www.-the-blocked-domain.com
) リソースの読み込みをブロックしました。 一時的な例外は、アプリの Info.plist ファイルを使用して構成できます。
iOS9 では、App Transport Security (ATS) によって、インターネット リソース (アプリのバックエンド サーバーなど) とアプリ間のセキュリティで保護された接続が強制されます。 さらに、ATS ではプロトコルを使用した HTTPS
通信と、TLS バージョン 1.2 を使用した高度な API 通信を前方秘密で暗号化する必要があります。
iOS 9 および OS X 10.11 (El Capitan) 用に構築されたアプリでは ATS が既定で有効になっているため、すべての接続で ATS を使用 NSURLConnection
するか、 CFURL
ATS NSURLSession
のセキュリティ要件が適用されます。 接続がこれらの要件を満たしていない場合、例外が発生して失敗します。
Apple は、コンパイル (または必要に応じて Xamarin と C# にトランスコード) でき、ATS/TLS の問題の診断に使用できる TLSTool サンプル アプリも提供しています。 この問題を 解決する方法については、以下の「ATS のオプトアウト」セクションを参照してください。
ATS オプションの構成
アプリ の Info.plist ファイルで特定のキーの値を設定することで、ATS のいくつかの機能を構成できます。 ATS を制御するには、次のキーを使用できます (入れ子になっている方法を示すためにインデントされます)。
NSAppTransportSecurity
NSAllowsArbitraryLoads
NSAllowsArbitraryLoadsInWebContent
NSExceptionDomains
<domain-name-for-exception-as-string>
NSExceptionMinimumTLSVersion
NSExceptionRequiresForwardSecrecy
NSExceptionAllowsInsecureHTTPLoads
NSRequiresCertificateTransparency
NSIncludesSubdomains
NSThirdPartyExceptionMinimumTLSVersion
NSThirdPartyExceptionRequiresForwardSecrecy
NSThirdPartyExceptionAllowsInsecureHTTPLoads
各キーの種類と意味は次のとおりです。
- NSAppTransportSecurity (
Dictionary
) - ATS のすべての設定キーと値が含まれます。 - NSAllowsArbitraryLoads (
Boolean
) - ATS が do に対して無効になる場合YES
はメインに記載NSExceptionDomains
されていません。 一覧表示された doメイン では、指定されたセキュリティ設定が使用されます。 - NSAllowsArbitraryLoadsInWebContent (
Boolean
) - Apple Transport Security (ATS) 保護がアプリの残りの部分で有効になっている間に Web ページの読み込みを正しく許可する場合YES
。 - N Standard Edition xceptionDoメインs (
Dictionary
) - doメインのコレクションと、ATS が特定の do に使用する必要があるセキュリティ設定メイン。 - <doメイン-name-for-exception-as-string> (
Dictionary
) - 特定の doメイン (例: ) の例外のコレクション。www.xamarin.com
- N Standard Edition xceptionMinimumTLSVersion () - TLS の最小バージョン
TLSv1.1
TLSv1.0
(既定値TLSv1.2
)。String
- N Standard Edition xceptionRequiresForwardSecrecy (
Boolean
) - 転送セキュリティで暗号を使用する必要がない場合NO
メイン。 既定値はYES
です。 - N Standard Edition xceptionAllowsInsecureHTTPLoads (
Boolean
) - この do を使用するすべての通信 (既定) がプロトコルにHTTPS
含まれている必要がある場合NO
メイン。 - NSRequiresCertificateTransparency (
Boolean
) - doメイン の Secure Sockets Layer (SSL) に有効な透過性データを含める必要がある場合YES
。 既定値はNO
です。 - NSIncludesSubdoメインs (
Boolean
) - これらの設定がすべてのサブドメインをオーバーライドする場合YES
メインメイン。 既定値はNO
です。 - NSThirdPartyExceptionMinimumTLSVersion (
String
) - doメイン が開発者の制御外のサード パーティのサービスである場合に使用される TLS バージョン。 - NSThirdPartyExceptionRequiresForwardSecrecy (
Boolean
) - サード パーティが行う場合YES
メイン前方秘密が必要です。 - NSThirdPartyExceptionAllowsInsecureHTTPLoads (
Boolean
) - ATS がサード パーティの doメインs とのセキュリティで保護されていない通信を許可する場合YES
。
ATS のオプトアウト
Apple は、プロトコルの使用とインターネット ベースの HTTPS
情報への安全な通信を強くお勧めしますが、これが常に可能であるとは限らない場合があります。 たとえば、サード パーティの Web サービスと通信している場合や、アプリでインターネット配信広告を使用している場合などです。
Xamarin.iOS アプリで安全でない操作を要求する必要がある場合メイン、アプリの Info.plist ファイルに次の変更を加えると、ATS が特定の do に対して適用するセキュリティの既定値が無効になりますメイン。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>www.the-domain-name.com</key>
<dict>
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.0</string>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
Visual Studio for Mac 内で、ソリューション エクスプローラー内のファイルをダブルクリックInfo.plist
し、[ソース] ビューに切り替えて、上記のキーを追加します。
アプリがセキュリティで保護されていないサイトから Web コンテンツを読み込んで表示する必要がある場合は、アプリの Info.plist ファイルに次を追加して、Apple Transport Security (ATS) 保護がアプリの残りの部分で有効になっている間に Web ページが正しく読み込まれるようします。
<key>NSAppTransportSecurity</key>
<dict>
<key> NSAllowsArbitraryLoadsInWebContent</key>
<true/>
</dict>
必要に応じて、アプリの Info.plist ファイルに次の変更を加えて、すべての doメイン とインターネット通信の ATS を完全に無効にすることができます。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Visual Studio for Mac 内で、ソリューション エクスプローラー内のファイルをダブルクリックInfo.plist
し、[ソース] ビューに切り替えて、上記のキーを追加します。
重要
アプリケーションで安全でない Web サイトへの接続が必要な場合は、ATS を完全にオフにするのではなく、常にNSAllowsArbitraryLoads
例外NSExceptionDomains
として doメイン を入力する必要があります。 NSAllowsArbitraryLoads
は、極端な緊急時にのみ使用する必要があります。
ここでも、ATS の無効化は、セキュリティで保護された接続への切り替えが利用できないか実用的でない場合にのみ、最後の手段として使用する必要があります。
まとめ
この記事では、App Transport Security (ATS) について説明し、インターネットとのセキュリティで保護された通信を適用する方法について説明しました。 最初に、iOS 9 で実行されている Xamarin.iOS アプリに対して ATS に必要な変更について説明しました。 その後、ATS の機能とオプションの制御について説明しました。 最後に、Xamarin.iOS アプリでの ATS のオプトアウトについて説明しました。