La sécurité des transports a bloqué Un HTTP clair
quel réglage dois-je mettre dans mon info.plist
pour activer le mode HTTP selon le message d'erreur suivant?
la sécurité des Transports a bloqué une ressource HTTP (http://) charge puisque c'est l'insécurité. Les exceptions temporaires peuvent être configurées via les infos de votre application.dossier plist.
Supposons que mon domaine est example.com
.
23 réponses
si vous utilisez Xcode 8.0 et Swift 3.0 ou Swift 2.2 ou même L'objectif 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>
utiliser:
vous devez définir le NSAllowsArbitraryLoads clé pour Oui sous nsapptransportsecurity dictionnaire dans votre .dossier plist.
Voir le post sur le forum Application de la Sécurité des Transports? .
aussi la page configurer les Exceptions de sécurité de Transport App dans iOS 9 et OSX 10.11 .
Par exemple, vous pouvez ajouter un domaine spécifique comme:
<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 paresseuse est:
<key>NSAppTransportSecurity</key>
<dict>
<!--Include to allow all connections (DANGER)-->
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Note:
info.plist
est un fichier XML de sorte que vous pouvez placer ce code plus ou moins n'importe où à l'intérieur du fichier.
cela a été testé et travaillait sur iOS 9 GM seed - c'est la configuration pour permettre à 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 il interdit toute connexion non sécurisée, mais la liste des exceptions permet la connexion à certains domaines sans HTTPS.
il s'agit d'une solution rapide (mais non recommandée) pour ajouter ceci dans la liste:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
qui signifie (selon documentation D'Apple ):
NSAllowsArbitraryLoads
Une valeur booléenne utilisée pour désactiver la sécurité de Transport App pour tous les domaines qui ne sont pas listés dans le dictionnaire NSExceptionDomains. Domaines d'utilisation les paramètres spécifiés pour ce domaine.la valeur par défaut de NO nécessite le comportement de sécurité de Transport par défaut de L'application pour toutes les connexions.
je recommande vivement les liens:
- Note technique D'Apple
- WWDC 2015 session 706 (Security and Your Apps) commence autour de 1: 50
- WWDC 2015 session 711 (Networking with NSURLSession)
- Blog post de l'Expédition d'une Application Avec l'Application de la Sécurité des Transports
qui m'aident à comprendre les raisons et toutes les implications.
Le XML (dans le fichier Info.plist) ci-dessous will:
<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>
interdit les appels arbitraires pour toutes les pages, mais pour PAGE_FOR_WHICH_SETTINGS_YOU_WANT_TO_OVERRIDE
permettra que les connexions utilisent le protocole HTTP.
au XML ci-dessus vous pouvez ajouter:
<key>NSIncludesSubdomains</key>
<true/>
si vous souhaitez autoriser des connexions non sécurisées pour les sous-domaines de l'adresse spécifiée.
la meilleure approche est de bloquer toutes les charges arbitraires (définies à false) et d'ajouter des exceptions pour permettre seulement les adresses que nous savons être très bien.
2018 Mise à jour:
Apple ne recommande pas de désactiver cette option - plus d'informations peuvent être trouvées dans 207 session WWDC 2018 avec plus de choses expliquées en ce qui concerne la sécurité
en Laissant l'original de la réplique, pour des raisons historiques et 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 le corriger, puis lire ci-dessous.
avec l'introduction de iOS 9, pour améliorer la sécurité des connexions entre une application et les services web, les connexions sécurisées entre une application et son service web doivent suivre les meilleures pratiques . Le comportement des meilleures pratiques est appliqué par l'application Sécurité des transports à:
- prévenir la divulgation accidentelle, et
- fournir un comportement par défaut qui est sécurisé.
comme expliqué dans le App Transport Security Technote , lors de la communication avec votre service web, App Transport Security a maintenant les exigences et le comportement suivants:
- le serveur doit supporte au moins la version 1.2 du protocole TLS (Transport Layer Security).
Les chiffres de connexion- sont limités à ceux qui assurent le secret (voir la liste des chiffres ci-dessous).)
Les certificats- doivent être signés à L'aide d'un algorithme de hachage de signature SHA256 ou mieux, avec une clé RSA 2048 bits ou plus ou une clé 256 bits ou plus. clé de la courbe elliptique supérieure (ECC).
- les certificats invalides entraînent une défaillance connexion.
en d'autres termes, votre demande de service web doit: A.) utiliser HTTPS et B.) être crypté en utilisant TLS v1.2 with forward secrecy.
cependant, comme cela a été mentionné dans d'autres messages, Vous pouvez outrepasser ce nouveau comportement de la sécurité de Transport App en spécifiant le domaine non sécurisé dans le Info.plist
de votre application.
vous devez ajouter les propriétés du dictionnaire NSAppTransportSecurity
> NSExceptionDomains
à votre Info.plist
. Ensuite, vous ajouterez le domaine de votre service web au dictionnaire NSExceptionDomains
.
par exemple, si je veux contourner le comportement de sécurité de Transport D'application pour un service web sur l'hôte www.yourwebservicehost.com alors je ferais ce qui suit:
-
ouvrez votre application dans Xcode.
-
trouvez le fichier
Info.plist
dans Project Navigator et cliquez sur le bouton droit de la souris et choisissez l'option de menu ouvrir comme > code Source . Le fichier de liste de propriétés apparaîtra dans le volet de droite. -
placez le bloc de propriétés suivant à l'intérieur du dictionnaire des propriétés principales (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 avez besoin de fournir des exceptions pour les domaines supplémentaires, alors vous ajouteriez une autre propriété du dictionnaire sous NSExceptionDomains
.
pour en savoir plus sur les touches référencées ci-dessus, lire cette technote déjà mentionnée .
Je n'aime pas éditer la liste directement. Vous pouvez facilement l'ajouter à la liste en utilisant le GUI:
- cliquez sur L'Info.plist dans le navigateur à gauche.
-
maintenant changer les données dans la zone principale:
- sur la dernière ligne ajouter le +
- Entrez le nom du groupe: App de Transport Paramètres de Sécurité
- clic droit sur le groupe et sélectionnez
Add Row
- Entrée Autoriser L'Arbitraire Des Charges
- fixe la valeur sur la droite à Oui
il y a deux solutions pour cela:
Solutions 1:
- Dans
Info.plist
fichier ajouter un dictionnaire avec la clé 'NSAppTransportSecurity
' - Ajouter un autre élément à l'intérieur du dictionnaire avec la touche
'Allow Arbitrary Loads'
Plist
la structure doit apparaître comme montré dans l'image ci-dessous.
Solution 2:
- Dans
Info.plist
fichier ajouter un dictionnaire avec la clé 'NSAppTransportSecurity
' - Ajouter un autre élément à l'intérieur du dictionnaire avec la touche
NSExceptionDomains
- Ajouter un élément avec la touche
'MyDomainName.com'
de type Nsdiction 1519350920" - ajouter l'élément avec la touche
NSIncludesSubdomains
" de typeBoolean
et la valeur fixée commeYES
- ajouter l'élément avec la clé "
NSTemporaryExceptionAllowsInsecureHTTPLoads
" de typeBoolean
et la valeur définie commeYES
Plist
la structure doit apparaître comme montré dans l'image ci-dessous.
la Solution 2 est préférée car elle n'autorise que le domaine sélectionné alors que la solution 1 autorise toutes les connexions HTTP non sécurisées.
la sécurité de Transport est disponible sur iOS 9.0 ou plus tard. Vous pouvez avoir cet avertissement en essayant d'appeler un WS à l'intérieur de votre application:
Application la sécurité du Transport a bloqué une charge de ressource HTTP (http://) puisqu'elle n'est pas sécurisée. Les exceptions temporaires peuvent être configurées via les informations de votre application.dossier plist.
ajouter ce qui suit à vos informations.plist va désactiver ATS:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key><true/>
</dict>
Exemple De Développement
Voici une capture d'écran d'une liste qui garde ATS intact (=secure), mais permet que les connexions à localhost peuvent être faites via HTTP au lieu de HTTPS . Il fonctionne en Xcode 7.1.1.
déterminer quels réglages peuvent être effectués automatiquement, comme indiqué dans cette technote :
/usr/bin/nscurl --ats-diagnostics --verbose https://your-domain.com
allez à vos infos.plist
- clic droit sur l'espace vide et cliquez sur Ajouter la ligne
- écrivez le nom de clé comme NSAppTransportSecurity ,sous
- sélectionner les domaines D'Exception, Ajouter un nouvel article à cette
- écrivez votre nom de domaine qui doit être consulté
- changer le type de domaine de chaîne de caractères au dictionnaire, ajouter un nouvel article
- NSTemporaryExceptionAllowsInsecurehttploads, qui sera un booléen avec une vraie valeur.
selon Apple, généralement désactiver ATS conduira au rejet de l'application, sauf si vous avez une bonne raison de le faire. Même alors, vous devriez ajouter des exceptions pour les domaines auxquels vous pouvez accéder en toute sécurité.
Apple a un excellent outil qui vous dit exactement quels paramètres utiliser: dans le Terminal, entrer
/usr/bin/nscurl --ats-diagnostics --verbose https://www.example.com/whatever
et nscurl va vérifier si cette requête échoue, puis essayer une variété de paramètres et vous dire exactement ce que l'on passe, et ce que faire. Par exemple, pour une URL de tiers que je visite, cette commande m'a dit que ce dictionnaire passe:
{
NSExceptionDomains = {
"www.example.com" = {
NSExceptionRequiresForwardSecrecy = false;
};
};
}
pour faire la distinction entre vos propres sites et les sites tiers qui sont hors de votre contrôle, utilisez, par exemple, la clé Nsthirdpartyexceptionrequiresforwardsecreccrecy.
utiliser:
Ajouter un nouvel article, NSAppTransportSecurity , dans le fichier de la liste avec le type Dictionary , puis ajouter le sous-article NSAllowsArbitraryLoads dans le dictionnaire de type Boolean , et mettre la valeur de bool YES . Cela fonctionne pour moi.
le 2015-09-25 (après les mises à jour de Xcode le 2015-09-18):
j'ai utilisé une méthode non paresseuse, mais ça n'a pas fonctionné. Les suivants sont mes essais.
Première", 151940920"
<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 second,
<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>
c'est peut-être un peu incertain, mais je n'ai pas pu trouver d'autres solutions.
NOTE: le domaine d'exception dans votre liste doit être en minuscule.
exemple: vous avez nommé votre machine" MyAwesomeMacbook " sous Paramètres->partage; votre serveur (à des fins de test) tourne sur MyAwesomeMacbook.local: 3000, et votre application doit envoyer une demande à http://MyAwesomeMacbook.local:3000/fichiers ..., votre liste vous aurez besoin de spécifier " myawesomemacbook.local " comme 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>
mise à jour pour Xcode 7.1, face au problème 27.10.15:
la nouvelle valeur dans L'Info.plist est "App Transport Security Settings". De là, ce dictionnaire devrait contenir:
- Autoriser l'Arbitraire des Charges = OUI
- domaines D'Exception (insérez ici votre domaine http)
Il peut être utile de mentionner comment s'y rendre...
Info.plist est l'un des fichiers sous le Main.storyboard ou viewController.Swift.
lorsque vous cliquez sur elle la première fois, il est généralement dans un format de tableau, donc droit cliquez sur le fichier et "ouvrir sous" code Source, puis ajouter le code ci-dessous vers la fin, i.e.:
<key>NSAppTransportSecurity</key><dict><key>NSAllowsArbitraryLoads</key><true/></dict>
copier coller le code juste au-dessus
"</dict>
</plist>"
qui est à la fin.
pour ceux qui sont venus ici en essayant de trouver la raison pour laquelle leur WKWebView est toujours blanc et ne charge rien (exactement comme décrit ici comment faire pour que WKWebView fonctionne dans swift et pour une application macOS ):
si toute la science de fusée ci-dessus ne fonctionne pas pour vous, vérifiez l'évident: les réglages du bac à sable
"151900920 Étant nouveau pour swift et le cacao, mais assez expérimenté dans la programmation, j'ai passé environ 20 heures à trouver cette solution. Aucune des douzaines de tutoriels hipster-iOS ou apple ne mentionne cette petite case à cocher.Pour Cordova, si vous voulez l'ajouter dans votre ios.json, faites ce qui suit:
"NSAppTransportSecurity": [
{
"xml": "<dict><key>NSAllowsArbitraryLoads</key><true /></dict>"
}
]
et il devrait être à l'intérieur de:
"*-Info.plist": {
"parents": {
}
}
utilisant NSExceptionDomains
ne peut pas appliquer un effet simultanément en raison du site cible peut charger des ressources (par exemple js
fichiers) à partir de domaines externes sur http
. Il peut être résolu en ajoutant ces domaines externes à NSExceptionDomains
ainsi.
pour vérifier quelles ressources ne peuvent pas être chargées, essayez D'utiliser le débogage à distance. Voici un tutoriel: http://geeklearning.io/apache-cordova-and-remote-debugging-on-ios /
comme beaucoup l'ont noté, il s'agit d'un problème de fonctionnalité qui vient avec iOS 9.0. Ils ont ajouté une chose appelée App Transport Security, et j'ai été aussi ennuyé quand il a cassé mes applications.
vous pouvez le bandage avec la clé NSAllowsArbitraryLoads à OUI sous NSAppTransportSecurity dictionary dans votre .le fichier plist, mais finalement vous devrez réécrire le code qui forme vos URL pour former le préfixe HTTPS://.
Apple a réécrit le Classe nslconnection dans iOS 9.0. Vous pouvez le lire dans " Nslconnection .
sinon, vous devrez peut-être renoncer à iOS 9.0 jusqu'à ce que vous ayez le temps de mettre en œuvre la bonne solution.