Quel paramètre dois-je définir dans mon info.plist
pour activer le mode HTTP conformément au message d'erreur suivant?
La sécurité du transport a bloqué une charge de ressources HTTP en texte clair (http: //), car elle n’est pas sécurisée. Des exceptions temporaires peuvent être configurées via le fichier Info.plist de votre application.
Supposons que mon domaine est example.com
.
Si vous utilisez Xcode 8.0 et Swift 3.0 ou Swift 2.2 ou même à Objective C:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSExceptionDomains</key>
<dict>
<key>example.com</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
Voir le message du forum Application Transport Security?.
Voir également la page Configuration des exceptions de sécurité pour le transport d'application dans iOS 9 et OSX 10.11.
Par exemple, vous pouvez ajouter un domaine spécifique tel que:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>example.com</key>
<dict>
<!--Include to allow subdomains-->
<key>NSIncludesSubdomains</key>
<true/>
<!--Include to allow HTTP requests-->
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
<!--Include to specify minimum TLS version-->
<key>NSTemporaryExceptionMinimumTLSVersion</key>
<string>TLSv1.1</string>
</dict>
</dict>
</dict>
L'option paresseux est:
<key>NSAppTransportSecurity</key>
<dict>
<!--Include to allow all connections (DANGER)-->
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
info.plist
est un fichier XML qui vous permet de placer ce code plus ou moins n'importe où dans le fichier.
Cela a été testé et fonctionnait sur iOS 9 GM graine - il s'agit de la configuration permettant à un domaine spécifique d'utiliser HTTP au lieu de HTTPS:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<false/>
<key>NSExceptionDomains</key>
<dict>
<key>example.com</key> <!--Include your domain at this line -->
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSTemporaryExceptionMinimumTLSVersion</key>
<string>TLSv1.1</string>
</dict>
</dict>
</dict>
NSAllowsArbitraryLoads
doit être false
, car elle interdit tout connexion non sécurisée, mais la liste des exceptions autorise la connexion à certains domaines sans HTTPS.
Ceci est une solution de contournement rapide (mais non recommandée) pour ajouter ceci dans le plist:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Ce qui signifie (selon documentation d'Apple ):
NSAllowsArbitraryLoads
Valeur booléenne utilisée pour désactiver App Transport Security pour tout domaine non répertorié dans le dictionnaire NSExceptionDomains. Les domaines répertoriés utilisent les paramètres spécifiés pour ce domaine.La valeur par défaut de NO nécessite le comportement par défaut de la sécurité de transport d'application pour toutes les connexions.
Je recommande vraiment les liens:
qui m'aident à comprendre les raisons et toutes les implications.
Le XML (dans le fichier Info.plist) ci-dessous va:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<false/>
<key>NSExceptionDomains</key>
<dict>
<key>PAGE_FOR_WHICH_SETTINGS_YOU_WANT_TO_OVERRIDE</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
</dict>
interdire les appels arbitraires pour toutes les pages, mais pour PAGE_FOR_WHICH_SETTINGS_YOU_WANT_TO_OVERRIDE
autorisera les connexions à utiliser le protocole HTTP.
Au XML ci-dessus, vous pouvez ajouter:
<key>NSIncludesSubdomains</key>
<true/>
si vous souhaitez autoriser les connexions non sécurisées pour les sous-domaines de l'adresse spécifiée.
La meilleure approche consiste à bloquer tous les chargements arbitraires (définis sur false) et à ajouter des exceptions pour autoriser uniquement les adresses connues.
Mise à jour de 2018:
Apple ne recommande pas de désactiver cette option. Pour plus d'informations, reportez-vous à la section 207 sessions WWDC 2018 , avec davantage d'explications concernant la sécurité.
Laisser la réponse initiale pour des raisons historiques et pendant la phase de développement
Pour ceux d’entre vous qui veulent plus de contexte sur pourquoi cela se produit, en plus de la façon de corrigez-le, puis lisez ci-dessous.
Avec l'introduction de iOS 9, pour améliorer la sécurité des connexions entre une application et des services Web, les connexions sécurisées entre une application et son service Web doivent respecter les meilleures pratiques . Le comportement des meilleures pratiques est imposé par App Transport Security pour:
Comme expliqué dans la Note de sécurité de la sécurité des applications , lors de la communication avec votre service Web, App Transport Security présente désormais les exigences et le comportement suivants:
- Le serveur doit prendre en charge au moins la version 1.2 du protocole TLS (Transport Layer Security).
- Les chiffrements de connexion sont limités à ceux qui assurent la confidentialité du transfert (voir la liste des chiffrements ci-dessous.)
- Les certificats doivent être signés à l'aide d'un algorithme de hachage de signature SHA256 ou supérieur, avec une clé RSA de 2048 bits ou supérieure ou une clé ECC (Elliptic-Curve) de 256 bits ou supérieure.
- Des certificats non valides entraînent une défaillance matérielle et aucune connexion.
En d’autres termes, votre demande de service Web doit: a.) Être chiffrée à l’aide de HTTPS et b.) À l’aide de TLS v1.2 avec la confidentialité du transfert.
Toutefois, comme indiqué dans d'autres publications, vous pouvez remplacer ce nouveau comportement à partir d'App Transport Security en spécifiant le domaine non sécurisé dans le Info.plist
de votre application.
Pour remplacer, vous devrez ajouter les propriétés du dictionnaire NSAppTransportSecurity
> NSExceptionDomains
à votre Info.plist
. Ensuite, vous allez ajouter le domaine de votre service Web au dictionnaire NSExceptionDomains
.
Par exemple, si je souhaite contourner le comportement App Transport Security pour un service Web sur l'hôte www.yourwebservicehost.com , il convient de procéder comme suit:
Ouvrez votre application dans Xcode.
Recherchez le fichier Info.plist
dans le Navigateur de projet et cliquez dessus avec le bouton droit de la souris, puis choisissez le Ouvrir comme > Code source option de menu. Le fichier de liste de propriétés apparaîtra dans le volet de droite.
Placez le bloc de propriétés suivant dans le dictionnaire de propriétés principal (sous le premier <dict>
).
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>www.example.com</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.1</string>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
Si vous devez fournir des exceptions pour des domaines supplémentaires, vous devez ajouter une autre propriété de dictionnaire sous NSExceptionDomains
.
Pour en savoir plus sur les clés référencées ci-dessus, lisez cette note technique déjà mentionnée .
Je n'aime pas éditer le plist directement. Vous pouvez facilement l'ajouter au plist en utilisant l'interface graphique:
Maintenant, changez les données dans la zone principale:
Add Row
Il y a deux solutions pour cela:
Solutions 1:
Info.plist
ajoutez un dictionnaire avec la clé 'NSAppTransportSecurity
''Allow Arbitrary Loads'
La structure Plist
devrait apparaître comme dans l'image ci-dessous.
Solution 2:
Info.plist
ajoutez un dictionnaire avec la clé 'NSAppTransportSecurity
'NSExceptionDomains
''MyDomainName.com'
de type NSDictionaryNSIncludesSubdomains
' de type Boolean
et une valeur définie comme YES
NSTemporaryExceptionAllowsInsecureHTTPLoads
' de type Boolean
et une valeur définie comme YES
La structure Plist
devrait apparaître comme dans l'image ci-dessous.
La solution 2 est préférable car elle n'autorise que le domaine sélectionné, tandis que la solution 1 autorise toutes les connexions HTTP non sécurisées.
La sécurité du transport est disponible sur iOS 9.0 ou version ultérieure. Vous pouvez avoir cet avertissement lorsque vous essayez d'appeler un WS dans votre application:
Application Transport Security a bloqué une charge de ressources HTTP en texte clair (http: //), car elle n'est pas sécurisée. Des exceptions temporaires peuvent être configurées via le fichier Info.plist de votre application.
Ajouter ce qui suit à votre Info.plist va désactiver ATS:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key><true/>
</dict>
Allez sur votre info.plist
Selon Apple, le fait de désactiver ATS entraîne généralement le rejet de l'application, à moins que vous n'ayez une bonne raison de le faire. Même dans ce cas, vous devez ajouter des exceptions pour les domaines auxquels vous pouvez accéder en toute sécurité.
Apple dispose d’un excellent outil qui vous indique exactement les paramètres à utiliser: Dans Terminal, entrez
/usr/bin/nscurl --ats-diagnostics --verbose https://www.example.com/whatever
et nscurl vérifiera si cette demande échoue, puis essaiera une variété de paramètres et vous dira lequel des deux passe et ce qu'il faut faire. Par exemple, pour certaines URL tierces que je visite, cette commande m'a indiqué que ce dictionnaire passait:
{
NSExceptionDomains = {
"www.example.com" = {
NSExceptionRequiresForwardSecrecy = false;
};
};
}
Pour distinguer vos propres sites des sites tiers hors de votre contrôle, utilisez, par exemple, la clé NSThirdPartyExceptionRequiresForwardSecrecy.
Déterminer quels paramètres utiliser peut être effectué automatiquement, comme indiqué dans la cette note technique :
/usr/bin/nscurl --ats-diagnostics --verbose https://your-domain.com
Le 2015-09-25 (après les mises à jour de Xcode le 2015-09-18):
J'ai utilisé une méthode non paresseuse, mais cela n'a pas fonctionné. Les suivants sont mes essais.
Première,
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>www.xxx.yyy.zzz</key>
<dict>
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSTemporaryExceptionMinimumTLSVersion</key>
<string>TLSv1.1</string>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
Et deuxieme,
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>www.xxx.yyy.zzz</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.1</string>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
Enfin, j'ai utilisé la méthode paresseuse:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Ce n'est peut-être pas très sûr, mais je n'ai pas pu trouver d'autres solutions.
REMARQUE: le domaine d'exception de votre plist doit être dans LOWER-CASE.
Exemple: vous avez nommé votre ordinateur "MyAwesomeMacbook" sous Paramètres-> Partage; votre serveur (à des fins de test) s'exécute sur MyAwesomeMacbook.local: 3000, et votre application doit envoyer une demande à http: //MyAwesomeMacbook.local: 3000/files ..., votre contact vous devrez spécifier "myawesomemacbook.local" en tant que domaine d'exception.
-
Votre info.plist contiendrait ...
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>myawesomemacbook.local</key>
<dict>
<!--Include to allow subdomains-->
<key>NSIncludesSubdomains</key>
<true/>
<!--Include to allow HTTP requests-->
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
</dict>
Dans Swift 4 et xcode 10, remplacez NSAllowsArbitraryLoads par Autoriser les charges arbitraires. alors ça va ressembler à ça:
<key>App Transport Security Settings</key>
<dict>
<key>Allow Arbitrary Loads</key><true/>
</dict>
Il peut être intéressant de mentionner comment y arriver ...
Info.plist est l'un des fichiers situés sous Main.storyboard ou viewController.Swift.
Lorsque vous cliquez dessus pour la première fois, il s’agit généralement d’un tableau, alors cliquez avec le bouton droit de la souris sur le fichier et ouvrez-le comme code source, puis ajoutez le code ci-dessous vers la fin, c’est-à-dire:
<key>NSAppTransportSecurity</key><dict><key>NSAllowsArbitraryLoads</key><true/></dict>
Copier coller le code juste au dessus
"</dict>
</plist>"
qui est à la fin.
Mise à jour pour Xcode 7.1, face au problème 27.10.15:
La nouvelle valeur dans Info.plist est "Paramètres de sécurité App Transport". À partir de là, ce dictionnaire devrait contenir:
Pour ceux qui sont venus ici pour trouver la raison pour laquelle leur WKWebView est toujours blanc et ne charge rien (exactement comme décrit ici comment puis-je faire fonctionner WKWebView dans Swift et pour une application macOS =):
Si toute la science ci-dessus ne vous convient pas, vérifiez ce qui est évident: les paramètres du bac à sable.
Étant novice en matière deSwift et de cacao, mais très expérimentée en programmation, j'ai passé environ 20 heures à trouver cette solution. Aucun des dizaines de tutoriels hipster-iOS, ni Apple keynotes - rien ne mentionne cette petite case à cocher.
L'utilisation de NSExceptionDomains
peut ne pas appliquer d'effet simultanément, car le site cible peut charger des ressources (par exemple, des fichiers js
) à partir de domaines externes sur http
. Vous pouvez également résoudre ce problème en ajoutant ces domaines externes à NSExceptionDomains
.
Pour vérifier quelles ressources ne peuvent pas être chargées, essayez d'utiliser le débogage distant. Voici un tutoriel: http://geeklearning.io/Apache-cordova-and-remote-debugging-on-ios/
Par défaut, iOS n'autorise que l'API HTTPS. Comme HTTP n'est pas sécurisé, vous devrez désactiver la sécurité du transport d'applications. Il existe deux manières de désactiver ATS: -
1. Ajoutez le code source dans le projet info.plist et ajoutez le code suivant dans la balise racine.
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
2. Utilisation des informations sur le projet.
Cliquez sur projet dans le volet gauche du projet, sélectionnez le projet comme cible et choisissez l'onglet Info. Vous devez ajouter le dictionnaire dans la structure suivante.
Pour Cordova, si vous souhaitez l'ajouter à votre fichier ios.json, procédez comme suit:
"NSAppTransportSecurity": [
{
"xml": "<dict><key>NSAllowsArbitraryLoads</key><true /></dict>"
}
]
Et cela devrait être à l'intérieur de:
"*-Info.plist": {
"parents": {
}
}