web-dev-qa-db-fra.com

Comment charger une URL HTTP avec App Transport Security activé dans iOS 9?

Ainsi, le nouveau SDK bêta d’iOS publié la nuit dernière contient "App Transport Security", qui encourage les développeurs à utiliser https au lieu de http. En principe, c'est une excellente idée et j'utilise déjà https dans nos environnements de transfert et de production. Cependant, https n'a pas été configuré dans mon environnement de développement local, lorsque l'application iOS se connecte à un service Web que j'utilise sur mon ordinateur portable.

En jouant un peu ce matin, il semble que le système de chargement d’URL, même si vous lui transmettez une URL http, décide d’utiliser https à la place. Est-ce que quelqu'un sait comment désactiver ce comportement - même pour des URL particulières?

410
Graeme Mathieson

Voir le référence Info.plist d’Apple pour plus de détails (merci @ gnasher729).

Vous pouvez ajouter des exceptions pour des domaines spécifiques dans votre Info.plist:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>testdomain.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <true/>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>
            <key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
            <false/>
            <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
            <true/>
            <key>NSThirdPartyExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>
            <key>NSRequiresCertificateTransparency</key>
            <false/>
        </dict>
    </dict>
</dict>

Toutes les clés de chaque domaine excepté sont facultatives. L’orateur n’a précisé aucune des clés, mais je pense qu’elles sont toutes raisonnablement évidentes.

(Source: WWDC 2015 session 703, "La confidentialité et votre application" , 30:18)

Vous pouvez également ignorer toutes les restrictions de sécurité du transport d'applications avec une seule clé, si votre application a de bonnes raisons de le faire:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

Si votre application n'a pas de bonne raison, vous risquez d'être rejeté.

Définir NSAllowsArbitraryLoads sur true lui permettra de fonctionner, mais Apple était très clair en ce sens qu'ils avaient l'intention de rejeter les applications qui utilisent cet indicateur sans raison spécifique. La principale raison d'utiliser NSAllowsArbitraryLoads est le contenu créé par l'utilisateur (partage de liens, navigateur Web personnalisé, etc.). Et dans ce cas, Apple s'attend toujours à ce que vous incluiez des exceptions qui appliquent l'ATS pour les URL dont vous avez le contrôle.

Si vous avez besoin d'accéder à des URL spécifiques non desservies par TLS 1.2, vous devez écrire des exceptions spécifiques pour ces domaines et ne pas utiliser NSAllowsArbitraryLoads défini sur yes. Vous trouverez plus d’informations dans la session NSURLSesssion WWDC.

Faites attention en partageant la solution NSAllowsArbitraryLoads. Ce n'est pas le correctif recommandé par Apple.

- kcharwood (merci @ marco-tolman)

672
adurdin

En tant que réponse acceptée, la réponse a fourni les informations requises, et pour plus d'informations sur l'utilisation de et vous pouvez en savoir plus sur App Transport Security .

Pour les exceptions par domaine, ajoutez-les à Info.plist :

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>yourserver.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>

Mais que se passe-t-il si je ne connais pas tous les domaines non sécurisés que je dois utiliser? Utilisez la clé suivante dans vos informations .plist

<key>NSAppTransportSecurity</key>
<dict>
  <!--Include to allow all connections (DANGER)-->
  <key>NSAllowsArbitraryLoads</key>
      <true/>
</dict>

Pour plus de détails, vous pouvez obtenir ce lien.

105
Akshay Sunderwani

Suivi this .

Je l'ai résolu en ajoutant des clés dans info.plist. Les étapes que j'ai suivies sont:

  1. Ouvert mon fichier de projets info.plist

  2. Ajout d'une clé appelée NSAppTransportSecurity en tant que Dictionary.

  3. Ajout d'une sous-clé appelée NSAllowsArbitraryLoads en tant que Boolean et définissez sa valeur sur YES en tant qu'image suivante. enter image description here

Nettoyez le projet et tout fonctionne comme avant.

Réf Lien .

54
Manab Kumar Mal

Si vous souhaitez simplement désactiver la stratégie de transport d'application pour les serveurs de développement locaux, les solutions suivantes fonctionnent bien. C'est utile lorsque vous ne pouvez pas ou qu'il est peu pratique de configurer HTTPS (par exemple, lorsque vous utilisez le serveur de développement de Google App Engine).

Comme d'autres l'ont dit cependant, l'ATP ne devrait absolument pas être désactivé pour les applications de production.

1) Utilisez un autre plist pour le débogage

Copiez votre fichier Plist et NSAllowsArbitraryLoads. Utilisez cette liste pour le débogage.

XCode Debug

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

2) Exclure les serveurs locaux

Alternativement, vous pouvez utiliser un seul fichier plist et exclure des serveurs spécifiques. Cependant, il ne semble pas que vous puissiez exclure les adresses IP 4 , vous devrez peut-être utiliser le nom du serveur (indiqué dans les Préférences Système -> Partage ou configuré dans votre DNS local).

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>server.local</key>
        <dict/>
        <key>NSExceptionAllowsInsecureHTTPLoads</key>
        <true/>
    </dict>
</dict>
30
Ian

J'ai résolu en fichier plist.

  1. Ajoutez un NSAppTransportSecurity: Dictionary.
  2. Ajouter une sous-clé nommée "NSAllowsArbitraryLoads" en tant que Boolean: YES

enter image description here

29
Avinash651

Les configurations ci-dessus ne fonctionnaient pas pour moi. J'ai essayé beaucoup de combinaisons de touches, celle-ci fonctionne bien:

enter image description here

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>mydomain.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
        </dict>
    </dict>
</dict>
21
Damien Romito

Compiler les réponses données par @adurdin et @User

Ajoutez les éléments suivants à votre info.plist & change localhost.com avec votre nom de domaine correspondant. Vous pouvez également ajouter plusieurs domaines:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>localhost.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <false/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <false/>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <true/>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>
            <key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
            <false/>
            <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
            <true/>
            <key>NSThirdPartyExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>
            <key>NSRequiresCertificateTransparency</key>
            <false/>
        </dict>
    </dict>
</dict>
</plist>

Votre info.plist doit ressembler à ceci:

enter image description here

17
Aqib Mumtaz

Voici ce qui a fonctionné pour moi:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <false/>
    <key>NSExceptionDomains</key>
    <dict>
        <key><!-- your_remote_server.com / localhost --></key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <true/>
        </dict>
    <!-- add more domain here -->
    </dict>
</dict>

Je veux juste ajouter ceci pour aider les autres et gagner du temps:

si vous utilisez: CFStreamCreatePairWithSocketToHost. assurez-vous que votre Host est identique à ce que vous avez dans votre .plist ou si vous avez un domaine distinct pour socket, ajoutez-le simplement ici.

CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)/*from .plist*/, (unsigned int)port, &readStream, &writeStream);

J'espère que c'est utile. À votre santé. :)

13
0yeoj