HttpClient et sélecteur d’implémentation SSL/TLS pour iOS/macOS

Le sélecteur d’implémentation HttpClient pour Xamarin.iOS, Xamarin.tvOS et Xamarin.Mac contrôle l’implémentation HttpClient à utiliser. Vous pouvez basculer vers une implémentation qui utilise des transports natifs iOS, tvOS ou macOS (NSUrlSession ou CFNetwork, selon le système d’exploitation). L’avantage est la prise en charge de TLS 1.2, des fichiers binaires plus petits et des téléchargements plus rapides . L’inconvénient est que la boucle d’événement doit être en cours d’exécution pour que les opérations asynchrones soient exécutées.

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 le NSUrlSession paramètre indiqué ci-dessous, puis recréer et redéployer vos applications sur vos utilisateurs.

Sélection d’une pile HttpClient

Pour ajuster le HttpClient utilisé par votre application :

  1. Double-cliquez sur le nom du projet dans le Explorateur de solutions pour ouvrir les options du projet.
  2. Basculez vers les paramètres de build de votre projet (par exemple, build iOS pour une application Xamarin.iOS).
  3. Dans la liste déroulante Implémentation de HttpClient , sélectionnez le HttpClient type comme suit : NSUrlSession (recommandé), CFNetwork ou Géré.

Choisissez implémentation HttpClient à partir de Managed, CFNetwork ou NSUrlSession

Conseil

Pour la prise en charge de TLS 1.2, l’option NSUrlSession est recommandée.

NSUrlSession

Le NSURLSessiongestionnaire basé sur est basé sur l’infrastructure native NSURLSession disponible dans iOS 7 et versions ultérieures. Il s'agit du paramètre recommandé.

Avantages

  • Il utilise des API natives pour de meilleures performances et une taille d’exécutable plus petite.
  • Prise en charge des normes les plus récentes, telles que TLS 1.2.

Inconvénients

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

CFNetwork

Le CFNetworkgestionnaire basé sur est basé sur l’infrastructure native CFNetwork disponible dans iOS 6 et versions ultérieures.

Avantages

  • Il utilise des API natives pour de meilleures performances et une taille d’exécutable plus petite.
  • Prise en charge de normes plus récentes telles que TLS 1.2.

Inconvénients

  • Nécessite iOS 6 ou version ultérieure.
  • Non disponible sur watchOS.
  • Certaines fonctionnalités/options HttpClient ne sont pas disponibles.

Adresses IP gérées

Le gestionnaire managé est le gestionnaire HttpClient complètement managé qui a été fourni avec la version précédente de Xamarin.

Avantages

  • Il dispose de l’ensemble de fonctionnalités le plus compatible avec Microsoft .NET et les versions antérieures de Xamarin.

Inconvénients

  • Il n’est pas entièrement intégré aux systèmes d’exploitation Apple et est limité à TLS 1.0. Il peut ne pas être en mesure de se connecter à des serveurs web ou à des services cloud sécurisés à l’avenir.
  • Il est généralement beaucoup plus lent à des choses telles que le chiffrement que les API natives.
  • Il nécessite plus de code managé, créant ainsi une application plus grande distribuable.

Définition par programmation de HttpMessageHandler

En plus de la configuration à l’échelle du projet illustrée ci-dessus, vous pouvez également instancier un HttpClient et injecter le souhaité HttpMessageHandler via le constructeur, comme illustré dans ces extraits de code :

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

Cela permet d’utiliser un autre HttpMessageHandler que ce qui est déclaré dans la boîte de dialogue Options du projet .

Implémentation SSL/TLS

SSL (Secure Socket Layer) et son successeur, TLS (Transport Layer Security), prennent en charge http et d’autres connexions réseau via System.Net.Security.SslStream. L’implémentation System.Net.Security.SslStream de Xamarin.iOS, Xamarin.tvOS ou Xamarin.Mac appellera l’implémentation SSL/TLS native d’Apple au lieu d’utiliser l’implémentation managée fournie par Mono. L’implémentation native d’Apple prend en charge TLS 1.2.

Avertissement

La prochaine version de Xamarin.Mac (4.8) prendra uniquement en charge macOS 10.9 ou ultérieur. Les versions précédentes de Xamarin.Mac prenaient en charge macOS 10.7 ou ultérieur, mais l’infrastructure TLS des anciennes versions de macOS n’était pas suffisante pour prendre en charge TLS 1.2. Pour cibler macOS 10.7 ou macOS 10.8, utilisez Xamarin.Mac 4.6 ou antérieur.

Sécurité de transport de l’application

App Transport Security (ATS) d’Apple applique des connexions sécurisées entre les ressources Internet (telles que le serveur principal de l’application) et votre application. ATS garantit que toutes les communications Internet sont conformes aux meilleures pratiques de connexion sécurisée, empêchant ainsi la divulgation accidentelle d’informations sensibles directement par le biais de votre application ou d’une bibliothèque qu’elle consomme.

Étant donné qu’ATS est activé par défaut dans les applications conçues pour iOS 9, tvOS 9 et OS X 10.11 (El Capitan) et les versions ultérieures, toutes les connexions utilisant NSUrlConnectionou CFUrlNSUrlSession seront soumises aux exigences de sécurité ATS. Si vos connexions ne répondent pas à ces exigences, elles échouent avec une exception.

En fonction de vos sélections de pile HttpClient et d’implémentation SSL/TLS, vous devrez peut-être apporter des modifications à votre application pour fonctionner correctement avec ATS.

Pour en savoir plus sur ATS, consultez notre guide sécurité du transport d’applications.

Problèmes connus

Cette section traite des problèmes connus liés à la prise en charge de TLS dans Xamarin.iOS.

Échec du chargement du projet avec l’erreur « La valeur demandée AppleTLS a été trouvée »

Xamarin.iOS 9.8 a introduit de nouveaux paramètres contenant le fichier .csproj pour une application Xamarin.iOS. Ces modifications peuvent entraîner des problèmes lorsque le projet est ouvert avec des versions antérieures de Xamarin.iOS. La capture d’écran suivante est un exemple du message d’erreur qui peut s’afficher dans ce scénario :

Capture d’écran de l’erreur lors de la tentative de chargement du projet, la valeur demandée héritée est introuvable

Cette erreur est due à l’introduction du MtouchTlsProvider paramètre dans le fichier projet dans Xamarin.iOS 9.8. S’il n’est pas possible de mettre à jour vers Xamarin.iOS 9.8 (ou version ultérieure), le contournement consiste à modifier manuellement l’application de fichier .csproj , à supprimer l’élément MtouchTlsprovider , puis à enregistrer le fichier projet modifié.

L’extrait de code suivant est un exemple de ce à quoi le MtouchTlsProvider paramètre peut ressembler à l’intérieur d’un fichier .csproj :

<MtouchTlsProvider>Default</MtouchTlsProvider>