iOS 9 : http / https App Transport Security has blocked

iOS 9 : http / https  App Transport Security has blocked

Nous nous attaquons à swift 2 / ios 9. L'un des premiers problèmes que nous rencontrons est la nouvelle réglementation d'Apple vis à vis de l'https.

Cela se nomme l'App Transport Security, il nous force à utiliser l'https, à la place de l'http dans les échanges que fait notre application avec un serveur. Non seulement il faut utiliser de l'https, mais spécifiquement la version TLS 1.2.

Soyons réaliste, c'est une bonne chose. C'est bien de pousser les devs dans cette direction, Apple garde sa politique de sécurisation. Par contre ... ca nous embête ! ;).

Effectivement, si l'on a la main sur le serveur que l'on interroge, pas de soucis. Dans le cas contraire cela peut vite devenir compliqué !

Il existe un moyen de le contourner, mais gardez bien en tête qu'il faut justifier se contournement à Apple lors de la publication.

Solution pour contourner App Transport Security
  • éditer le fichier info.plist de l'application (ex : instagram)

  • y insérer ce que nous désirons ;)

       <key>api.instagram.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>
      <key>scontent.cdninstagram.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>
    
Avertissement

Setting NSAllowsArbitraryLoads to true will allow it to work, but Apple was very clear in that they intend to reject apps who use this flag without a specific reason. The main reason to use NSAllowsArbitraryLoads I can think of would be user created content (link sharing, custom web browser, etc). And in this case, Apple still expects you to include exceptions that enforce the ATS for the URLs you are in control of.

If you do need access to specific URLs that are not served over TLS 1.2, you need to write specific exceptions for those domains, not use NSAllowsArbitraryLoads set to yes. You can find more info in the NSURLSesssion WWDC session.

Please be careful in sharing the NSAllowsArbitraryLoads solution. It is not the recommended fix from Apple.

Edit 05/10/2015

1/ Pour le moment, les applications by-passant APS ne serait pas rejetées. ;)
2/ Nous testons StartSsl pour mettre en place un premier certificat gratuitement, si tout cela fonctionne parfaitement, un tuto suivra.

Documentation d'apple