web-dev-qa-db-fra.com

La sécurité des transports a bloqué un HTTP en texte clair

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.

Xcode

Supposons que mon domaine est example.com.

1401
Jeef

Si vous utilisez Xcode 8.0 et Swift 3.0 ou Swift 2.2 ou même à Objective C:

Enter image description here

<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>
398
Anit Kumar

Utilisation:

Enter image description here

Vous devez définir la clé NSAllowsArbitraryLoads sur YES sous NSAppTransportSecurity dictionnaire dans votre fichier .plist.

Plist configuration

926
User123335511231

Voici les paramètres visuellement:

visual settings for NSAllowsArbitraryLoads in info.plist via Xcode GUI

820
William Cerniuk

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>

Remarque:

info.plist est un fichier XML qui vous permet de placer ce code plus ou moins n'importe où dans le fichier.

706
KMLong

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.

322
Sound Blaster

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.

Pour les lecteurs intéressés

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

143
Julian Król

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:

  • empêcher la divulgation accidentelle, et
  • fournir un comportement par défaut qui est sécurisé.

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:

  1. Ouvrez votre application dans Xcode.

  2. 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.

  3. 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 .

115
whyceewhite

Je n'aime pas éditer le plist directement. Vous pouvez facilement l'ajouter au plist en utilisant l'interface graphique:

  • Cliquez sur Info.plist dans le navigateur à gauche.
  • Maintenant, changez les données dans la zone principale:

    • Sur la dernière ligne, ajoutez le +
    • Entrez le nom du groupe: Paramètres de sécurité de transport d'application
    • Faites un clic droit sur le groupe et sélectionnez Add Row
    • Entrez Autoriser les charges arbitraires
    • Définissez la valeur à droite sur YES

Example

67
Vincent

Apple Document 1

Apple Document 2

Il y a deux solutions pour cela:

Solutions 1:

  1. Dans le fichier Info.plist ajoutez un dictionnaire avec la clé 'NSAppTransportSecurity'
  2. Ajouter un autre élément dans le dictionnaire avec la clé 'Allow Arbitrary Loads'

La structure Plist devrait apparaître comme dans l'image ci-dessous.

Solution 1

Solution 2:

  1. Dans le fichier Info.plist ajoutez un dictionnaire avec la clé 'NSAppTransportSecurity'
  2. Ajouter un autre élément dans le dictionnaire avec la clé 'NSExceptionDomains'
  3. Ajouter un élément avec la clé 'MyDomainName.com' de type NSDictionary
  4. Ajouter un élément avec la clé 'NSIncludesSubdomains' de type Boolean et une valeur définie comme YES
  5. Ajouter un élément avec la clé 'NSTemporaryExceptionAllowsInsecureHTTPLoads' de type Boolean et une valeur définie comme YES

La structure Plist devrait apparaître comme dans l'image ci-dessous.

Solution 2

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.

25
Jayprakash Dubey

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>
20
Malek Belkahla

Exemple de développement

Voici une capture d'écran d'un plist qui maintient ATS intact (= sécurisé), mais permet que des connexions à localhost puissent être établies via HTTP au lieu de HTTPS . Cela fonctionne dans Xcode 7.1.1.

Enter image description here

14
Sebastian

Allez sur votre info.plist

  1. Clic droit sur un espace vide et cliquez sur Ajouter une ligne
  2. Écrivez le nom de la clé sous NSAppTransportSecurity, en dessous.
  3. Sélectionnez les domaines d'exception, Ajouter un nouvel élément à cette
  4. Ecrivez votre nom de domaine qui doit être consulté
  5. Changez le type de domaine de String en Dictionnaire, ajoutez un nouvel élément
  6. NSTemporaryExceptionAllowsInsecureHTTPLoads, ce sera un booléen avec une valeur vraie. Look at the picture to follow it correctly
13
Shailendra Suriyal

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.

11
gnasher729

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
11
ecotax

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.

9
Heedoo

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>
9
ObjectiveTC

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>
8
Faris

Utilisation:

PList Screenshot to understand better

Ajouter un nouvel élément, NSAppTransportSecurity , dans le fichier plist avec le type Dictionary , puis ajoutez un sous-élément NSAllowsArbitraryLoads dans un dictionnaire de type Booléen et définissez valeur booléenne OUI. Cela fonctionne pour moi.

8
Tejinder

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.

6
Naishta

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:

  • Autoriser les charges arbitraires = OUI
  • Domaines d'exception (insérez ici votre domaine http)
5
MkaysWork

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.

sandbox settings]

É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.

4

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/

1
Nurlan Akashayev

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.

enter image description here

1
varunrathi28

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": {
   }
}
0
zeusstl