HttpClient Stack et sélecteur d’implémentation SSL/TLS pour Android

Les sélecteurs de pile HttpClient et d’implémentation SSL/TLS déterminent l’implémentation HttpClient et SSL/TLS qui sera utilisée par vos applications Xamarin.Android.

Les projets doivent référencer l’assembly System.Net.Http .

Avertissement

Avril 2018 – En raison d’exigences de sécurité accrues, notamment la conformité PCI, les principaux fournisseurs de cloud et serveurs web doivent cesser de prendre en charge les versions TLS antérieures à 1.2. Les projets Xamarin créés dans les versions précédentes de Visual Studio utilisent par défaut des versions antérieures de TLS.

Pour vous assurer que vos applications continuent à fonctionner avec ces serveurs et services, vous devez mettre à jour vos projets Xamarin avec les Android HttpClient paramètres et Native TLS 1.2 indiqués ci-dessous, puis recréer et redéployer vos applications sur vos utilisateurs.

La configuration HttpClient Xamarin.Android se trouve dans Options > du projet Options Android, puis cliquez sur le bouton Options avancées .

Voici les paramètres recommandés pour la prise en charge de TLS 1.2 :

Visual Studio Android Options

Autres options de configuration

AndroidClientHandler

AndroidClientHandler est le nouveau gestionnaire qui délègue au code Java/OS natif au lieu d’implémenter tout dans le code managé. C'est l'option recommandée.

Avantages

  • Utilisez l’API native pour de meilleures performances et une taille d’exécutable plus petite.
  • Prise en charge des normes les plus récentes, par exemple TLS 1.2.

Inconvénients

  • Nécessite Android 4.1 ou version ultérieure.
  • Certaines fonctionnalités/options HttpClient ne sont pas disponibles.

Géré (HttpClientHandler)

Le gestionnaire managé est le gestionnaire HttpClient complètement managé qui a été fourni avec les versions précédentes de Xamarin.Android.

Avantages

  • Il s’agit des (fonctionnalités) les plus compatibles avec MS .NET et les versions antérieures de Xamarin.

Inconvénients

  • Il n’est pas entièrement intégré au système d’exploitation (par exemple, limité à TLS 1.0).
  • Il est généralement beaucoup plus lent (par exemple, le chiffrement) que l’API native.
  • Il nécessite davantage de code managé, ce qui crée des applications plus volumineuses.

Choix d’un gestionnaire

Le choix entre AndroidClientHandler et HttpClientHandler dépend des besoins de votre application. AndroidClientHandler est recommandé pour la prise en charge de la sécurité la plus récente, par exemple.

  • Vous avez besoin de la prise en charge de TLS 1.2+ .
  • Votre application cible Android 4.1 (API 16) ou version ultérieure.
  • Vous avez besoin de la prise en charge de TLS 1.2+ pour HttpClient.
  • Vous n’avez pas besoin de la prise en charge de TLS 1.2+ pour WebClient.

HttpClientHandler est un bon choix si vous avez besoin de la prise en charge de TLS 1.2+ mais que vous devez prendre en charge les versions d’Android antérieures à Android 4.1. Il s’agit également d’un bon choix si vous avez besoin de la prise en charge de TLS 1.2+ pour WebClient.

À compter de Xamarin.Android 8.3, HttpClientHandler la valeur par défaut est Boring SSL (btls) comme fournisseur TLS sous-jacent. Le fournisseur TLS SSL ennuyeux offre les avantages suivants :

  • Il prend en charge TLS 1.2+.
  • Il prend en charge toutes les versions d’Android.
  • Il fournit la prise en charge de TLS 1.2+ pour et HttpClientWebClient.

L’inconvénient de l’utilisation de Boring SSL comme fournisseur TLS sous-utilisé est qu’il peut augmenter la taille de l’APK résultant (il ajoute environ 1 Mo de taille APK supplémentaire par ABI pris en charge).

À compter de Xamarin.Android 8.3, le fournisseur TLS par défaut est SSL ennuyeux (btls). Si vous ne souhaitez pas utiliser ssl boring, vous pouvez revenir à l’implémentation SSL managée historique en définissant la propriété legacy sur (pour plus d’informations sur la $(AndroidTlsProvider) définition des propriétés de build, consultez Processus de génération).

Utilisation programmatique AndroidClientHandler

Est Xamarin.Android.Net.AndroidClientHandler une HttpMessageHandler implémentation spécifique pour Xamarin.Android. Les instances de cette classe utilisent l’implémentation native java.net.URLConnection pour toutes les connexions HTTP. Cela permet théoriquement d’augmenter les performances HTTP et de réduire les tailles d’APK.

Cet extrait de code est un exemple de façon explicite pour une seule instance de la HttpClient classe :

// Android 4.1 or higher, Xamarin.Android 6.1 or higher
HttpClient client = new HttpClient(new Xamarin.Android.Net.AndroidClientHandler ());

Notes

L’appareil Android sous-jacent doit prendre en charge TLS 1.2 (par exemple. Android 4.1 et versions ultérieures). Notez que la prise en charge officielle de TLS 1.2 est dans Android 5.0+. Toutefois, certains appareils prennent en charge TLS 1.2 dans Android 4.1+.

Option de génération d’implémentation SSL/TLS

Cette option de projet contrôle la bibliothèque TLS sous-jacente qui sera utilisée par toutes les requêtes web, à la fois HttpClient et WebRequest. Par défaut, TLS 1.2 est sélectionné :

Par exemple :

var client = new HttpClient();

Si l’implémentation HttpClient a été définie sur Managed et que l’implémentation TLS a été définie sur Native TLS 1.2+, l’objet client utilise automatiquement le managé HttpClientHandler et TLS 1.2 (fourni par la bibliothèque BoringSSL) pour ses requêtes HTTP.

Toutefois, si l’implémentation HttpClient est définie sur AndroidHttpClient, tous les HttpClient objets utilisent la classe java.net.URLConnection Java sous-jacente et ne sont pas affectés par la valeur d’implémentation TLS/SSL . WebRequest les objets utilisent la bibliothèque BoringSSL.

Autres façons de contrôler la configuration SSL/TLS

Une application Xamarin.Android peut contrôler les paramètres TLS de trois façons :

  1. Sélectionnez l’implémentation HttpClient et la bibliothèque TLS par défaut dans options du projet.
  2. Utilisation programmatique de Xamarin.Android.Net.AndroidClientHandler.
  3. Déclarez des variables d’environnement (facultatif).

Parmi les trois choix, l’approche recommandée consiste à utiliser les options de projet Xamarin.Android pour déclarer la valeur par défaut HttpMessageHandler et TLS pour l’ensemble de l’application. Ensuite, si nécessaire, instanciez Xamarin.Android.Net.AndroidClientHandler des objets par programmation. Ces options sont décrites ci-dessus.

La troisième option, l’utilisation de variables d’environnement, est expliquée ci-dessous.

Déclarer des variables d’environnement

Deux variables d’environnement sont liées à l’utilisation de TLS dans Xamarin.Android :

  • XA_HTTP_CLIENT_HANDLER_TYPE : cette variable d’environnement déclare la valeur par défaut HttpMessageHandler que l’application utilisera. Par exemple :

    XA_HTTP_CLIENT_HANDLER_TYPE=Xamarin.Android.Net.AndroidClientHandler
    
  • XA_TLS_PROVIDER : cette variable d’environnement déclare la bibliothèque TLS qui sera utilisée, btls, legacyou default (ce qui équivaut à omettre cette variable) :

    XA_TLS_PROVIDER=btls
    

Cette variable d’environnement est définie en ajoutant un fichier d’environnement au projet. Un fichier d’environnement est un fichier de texte brut au format Unix avec une action de génération d’AndroidEnvironment :

Pour plus d’informations sur les variables d’environnement et Xamarin.Android, consultez le Guide de l’environnement Xamarin.Android .