App Transport Security dans Xamarin.iOS
App Transport Security (ATS) applique des connexions sécurisées entre les ressources Internet (telles que le serveur principal de l’application) et votre application.
Cet article présente les modifications de sécurité appliquées par App Transport Security sur une application iOS 9 et ce que cela signifie pour vos projets Xamarin.iOS, il couvre les options de configuration ATS et explique comment désactiver ATS ATS ATS si nécessaire. Étant donné que ATS est activé par défaut, toutes les connexions Internet non sécurisées déclenchent une exception dans les applications iOS 9 (sauf si vous l’avez explicitement autorisée).
À propos de App Transport Security
Comme indiqué ci-dessus, ATS garantit que toutes les communications Internet dans iOS 9 et OS X El Capitan sont conformes aux meilleures pratiques de connexion sécurisées, ce qui empêche la divulgation accidentelle d’informations sensibles directement via votre application ou une bibliothèque qu’elle consomme.
Pour les applications existantes, implémentez le protocole dans la HTTPS
mesure du possible. Pour les nouvelles applications Xamarin.iOS, vous devez utiliser HTTPS
exclusivement lors de la communication avec des ressources Internet. En outre, la communication d’API de haut niveau doit être chiffrée à l’aide de TLS version 1.2 avec secret de transfert.
Toute connexion établie avec NSUrl Connecter ion, CFUrl ou NSUrlSession utilise ATS par défaut dans les applications créées pour iOS 9 et OS X 10.11 (El Capitan).
Comportement ATS par défaut
Étant donné que ATS est activé par défaut dans les applications créées pour iOS 9 et OS X 10.11 (El Capitan), toutes les connexions utilisant NSUrl Connecter ion, CFUrl ou NSUrlSession sont soumises aux exigences de sécurité ATS. Si vos connexions ne répondent pas à ces exigences, elles échouent avec une exception.
Configuration requise pour la Connecter ion ATS
ATS applique les exigences suivantes pour toutes les connexions Internet :
- Tous les chiffrements de connexion doivent utiliser le secret de transfert. Consultez la liste des chiffrements acceptés ci-dessous.
- Le protocole TLS (Transport Layer Security) doit être version 1.2 ou ultérieure.
- Au moins une empreinte digitale SHA256 avec une clé RSA 2048 ou supérieure, ou une clé 256 bits ou plus Elliptic-Curve (ECC) doit être utilisée pour tous les certificats.
Là encore, étant donné que ATS est activé par défaut dans iOS 9, toute tentative d’établir une connexion qui ne répond pas à ces exigences entraîne la levée d’une exception.
Chiffrements compatibles ATS
Le type de chiffrement de secret avant suivant est accepté par les communications Internet sécurisées 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
Pour plus d’informations sur l’utilisation des classes de communication Internet iOS, consultez la référence de classe NSURL Connecter ion d’Apple ou la référence de classe NSURLSession.
Prise en charge d’ATS dans Xamarin.iOS
Étant donné que ATS est activé par défaut dans iOS 9 et OS X El Capitan, si votre application Xamarin.iOS ou n’importe quel service ou bibliothèque qu’elle utilise utilise établit une connexion à Internet, vous devez effectuer une action ou vos connexions entraînent une exception levée.
Pour une application existante, Apple vous suggère de prendre en charge le HTTPS
protocole dès que possible. Si vous ne pouvez pas parce que vous vous connectez à un service web tiers qui ne prend pas en charge ou si la prise en charge HTTPS
HTTPS
serait irréalisable, vous pouvez refuser ATS. Pour plus d’informations, consultez la section Refus d’ATS ci-dessous.
Pour une nouvelle application Xamarin.iOS, vous devez utiliser HTTPS
exclusivement lors de la communication avec des ressources Internet. Là encore, il peut y avoir des situations (comme l’utilisation d’un service web tiers) où cela n’est pas possible et que vous devrez désactiver ATS.
En outre, ATS applique la communication d’API de haut niveau à chiffrer à l’aide de TLS version 1.2 avec le secret avant. Pour plus d’informations, consultez les sections configuration requises pour les Connecter ion ATS et les chiffrements compatibles ATS ci-dessus.
Bien que vous ne connaissiez peut-être pas TLS (Transport Layer Security) il s’agit du successeur de SSL (Secure Socket Layer) et fournit une collection de protocoles de chiffrement pour appliquer la sécurité sur les connexions réseau.
Le niveau TLS est contrôlé par le service web que vous consommez et est donc en dehors du contrôle de l’application. HttpClient
Le chiffrement ModernHttpClient
TLS le plus élevé pris en charge par le serveur doit être automatiquement utilisé.
Selon le serveur auquel vous parlez (en particulier s’il s’agit d’un service tiers), vous devrez peut-être désactiver le secret de transfert ou sélectionner un niveau TLS inférieur. Pour plus d’informations, consultez la section Configuration des options ATS ci-dessous.
Important
App Transport Security ne s’applique pas aux applications Xamarin à l’aide d’implémentations HTTPClient gérées. Il s’applique aux connexions à l’aide des implémentations HTTPClient CFNetwork ou des implémentations HTTPClient NSURLSession uniquement.
Définition de l’implémentation HTTPClient
Pour définir l’implémentation HTTPClient utilisée par une application iOS, double-cliquez sur le projet dans le Explorateur de solutions pour ouvrir les options du projet. Accédez à build iOS et sélectionnez le type de client souhaité dans la liste déroulante d’implémentation HttpClient :
Gestionnaire managé
Le gestionnaire managé est le gestionnaire HttpClient entièrement managé qui a été fourni avec les versions précédentes de Xamarin.iOS et est le gestionnaire par défaut.
Avantages :
- Il est le plus compatible avec Microsoft .NET et une version antérieure de Xamarin.
Inconvénients :
- Il n’est pas entièrement intégré à iOS (par exemple, il est limité à TLS 1.0).
- Il est généralement beaucoup plus lent que les API natives.
- Il nécessite un code managé plus important et crée des applications plus volumineuses.
Gestionnaire CFNetwork
Le gestionnaire cfNetwork est basé sur l’infrastructure native CFNetwork
.
Avantages :
- Utilise l’API native pour améliorer les performances et les tailles exécutables plus petites.
- Ajoute la prise en charge des normes plus récentes telles que TLS 1.2.
Inconvénients :
- Nécessite iOS 6 ou version ultérieure.
- Non disponible de watchOS.
- Certaines fonctionnalités et options HttpClient ne sont pas disponibles.
Gestionnaire NSUrlSession
Le gestionnaire NSUrlSession est basé sur l’API native NSUrlSession
.
Avantages :
- Utilise l’API native pour améliorer les performances et les tailles exécutables plus petites.
- Ajoute la prise en charge des normes plus récentes telles que TLS 1.2.
Inconvénients :
- Nécessite iOS 7 ou version ultérieure.
- Certaines fonctionnalités et options HttpClient ne sont pas disponibles.
Diagnostic des problèmes ATS
Lorsque vous tentez de vous connecter à Internet, directement ou à partir d’une vue web dans iOS 9, vous pouvez obtenir une erreur dans le formulaire :
App Transport Security a bloqué une charge de ressource HTTP (
http://www.-the-blocked-domain.com
) cleartext, car elle n’est pas sécurisée. Les exceptions temporaires peuvent être configurées via le fichier Info.plist de votre application.
Dans iOS9, App Transport Security (ATS) applique des connexions sécurisées entre les ressources Internet (telles que le serveur principal de l’application) et votre application. En outre, ATS nécessite la communication à l’aide du protocole et de la HTTPS
communication d’API de haut niveau pour être chiffrée à l’aide de TLS version 1.2 avec secret avant.
Étant donné que ATS est activé par défaut dans les applications créées pour iOS 9 et OS X 10.11 (El Capitan), toutes les connexions utilisant NSURLConnection
ou CFURL
NSURLSession
seront soumises aux exigences de sécurité ATS. Si vos connexions ne répondent pas à ces exigences, elles échouent avec une exception.
Apple fournit également l’exemple d’application TLSTool qui peut être compilée (ou éventuellement transcodée en Xamarin et C#) et utilisée pour diagnostiquer les problèmes ATS/TLS. Pour plus d’informations sur la façon de résoudre ce problème, consultez la section Opting-Out of ATS ci-dessous.
Configuration des options ATS
Vous pouvez configurer plusieurs fonctionnalités d’ATS en définissant des valeurs pour des clés spécifiques dans le fichier Info.plist de votre application. Les clés suivantes sont disponibles pour contrôler ATS (mis en retrait pour montrer comment elles sont imbriquées) :
NSAppTransportSecurity
NSAllowsArbitraryLoads
NSAllowsArbitraryLoadsInWebContent
NSExceptionDomains
<domain-name-for-exception-as-string>
NSExceptionMinimumTLSVersion
NSExceptionRequiresForwardSecrecy
NSExceptionAllowsInsecureHTTPLoads
NSRequiresCertificateTransparency
NSIncludesSubdomains
NSThirdPartyExceptionMinimumTLSVersion
NSThirdPartyExceptionRequiresForwardSecrecy
NSThirdPartyExceptionAllowsInsecureHTTPLoads
Chaque clé a le type et la signification suivants :
- NSAppTransportSecurity (
Dictionary
) : contient toutes les clés et valeurs de paramètre pour ATS. - NSAllowsArbitraryLoads (
Boolean
) : siYES
ATS est désactivé pour un domaine non répertorié dansNSExceptionDomains
. Pour les domaines répertoriés, les paramètres de sécurité spécifiés sont utilisés. - NSAllowsArbitraryLoadsInWebContent (
Boolean
) : s’ilYES
permet aux pages web de se charger correctement pendant que la protection ATS (Apple Transport Security) est toujours activée pour le reste de l’application. - NSExceptionDomains (
Dictionary
) : collection de domaines qui et les paramètres de sécurité que ATS doit utiliser pour un domaine donné. - <domain-name-for-exception-as-string> (
Dictionary
) : collection d’exceptions pour un domaine donné (par exemplewww.xamarin.com
). - NSExceptionMinimumTLSVersion (
String
) : version TLS minimale comme l’uneTLSv1.1
TLSv1.0
ouTLSv1.2
l’autre (qui est la valeur par défaut). - NSExceptionRequiresForwardSecrecy (
Boolean
) : siNO
le domaine n’a pas besoin d’utiliser un chiffrement avec la sécurité de transfert. La valeur par défaut estYES
. - NSExceptionAllowsInsecureHTTPLoads (
Boolean
) : siNO
(valeur par défaut) toutes les communications avec ce domaine doivent se trouver dans leHTTPS
protocole. - NSRequiresCertificateTransparency (
Boolean
) : siYES
le protocole SSL (Secure Sockets Layer) du domaine doit inclure des données de transparence valides. La valeur par défaut estNO
. - NSIncludesSubdomains (
Boolean
) : siYES
ces paramètres remplacent tous les sous-domaines de ce domaine. La valeur par défaut estNO
. - NSThirdPartyExceptionMinimumTLSVersion (
String
) : version TLS utilisée lorsque le domaine est un service tiers en dehors du contrôle du développeur. - NSThirdPartyExceptionRequiresForwardSecrecy (
Boolean
) : siYES
un domaine tiers nécessite le secret avant. - NSThirdPartyExceptionAllowsInsecureHTTPLoads (
Boolean
) : siYES
l’ATS autorise la communication non sécurisée avec des domaines tiers.
Désactivation d’ATS
Bien qu’Apple suggère fortement d’utiliser le HTTPS
protocole et la communication sécurisée vers les informations basées sur Internet, il peut arriver que cela ne soit pas toujours possible. Par exemple, si vous communiquez avec un service web tiers ou que vous utilisez des publicités fournies par Internet dans votre application.
Si votre application Xamarin.iOS doit effectuer une demande à un domaine non sécurisé, les modifications suivantes apportées au fichier Info.plist de votre application désactivent les valeurs par défaut de sécurité appliquées par ATS pour un domaine donné :
<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>
Dans Visual Studio pour Mac, double-cliquez sur le Info.plist
fichier dans le Explorateur de solutions, basculez vers la vue Source et ajoutez les clés ci-dessus :
Si votre application doit charger et afficher du contenu web à partir de sites non sécurisés, ajoutez les éléments suivants au fichier Info.plist de votre application pour permettre aux pages web de charger correctement pendant que la protection Apple Transport Security (ATS) est toujours activée pour le reste de l’application :
<key>NSAppTransportSecurity</key>
<dict>
<key> NSAllowsArbitraryLoadsInWebContent</key>
<true/>
</dict>
Si vous le souhaitez, vous pouvez apporter les modifications suivantes au fichier Info.plist de votre application pour désactiver complètement ATS pour tous les domaines et la communication Internet :
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Dans Visual Studio pour Mac, double-cliquez sur le Info.plist
fichier dans le Explorateur de solutions, basculez vers la vue Source et ajoutez les clés ci-dessus :
Important
Si votre application nécessite une connexion à un site web non sécurisé, vous devez toujours entrer le domaine en tant qu’exception à l’aide NSExceptionDomains
d’ATS au lieu de désactiver complètement ATS à l’aide NSAllowsArbitraryLoads
. NSAllowsArbitraryLoads
ne doit être utilisé que dans des situations d’urgence extrêmes.
Là encore, la désactivation d’ATS ne doit être utilisée qu’en dernier recours, si le passage à des connexions sécurisées n’est pas disponible ou n’est pas pratique.
Résumé
Cet article a introduit App Transport Security (ATS) et décrit la façon dont il applique des communications sécurisées avec Internet. Tout d’abord, nous avons abordé les modifications requises par ATS pour une application Xamarin.iOS s’exécutant sur iOS 9. Nous avons ensuite abordé le contrôle des fonctionnalités et des options ATS. Enfin, nous avons abordé la désactivation d’ATS dans votre application Xamarin.iOS.