J'ai installé Xcode 7 et essayé d'exécuter mon application sous iOS 9. Je reçois la fameuse erreur: Connection failed! Error - -1200 An SSL error has occurred and a secure connection to the server cannot be made.
Le problème est que mon serveur prend en charge TLSv1.2 et j'utilise NSURLSession
.
Quel pourrait être le problème alors?
Apple a publié la liste complète des exigences pour App Transport Security .
Il s'est avéré que nous travaillions avec TLS v1.2 mais qu'il manquait certaines des autres exigences.
Voici la liste de contrôle complète:
Les chiffres acceptés sont:
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
Dans iOS9, Apple a ajouté une nouvelle fonctionnalité appelée App Transport Security (ATS).
ATS applique les meilleures pratiques lors des appels réseau, y compris l'utilisation de HTTPS.
Documentation préliminaire Apple:
ATS empêche la divulgation accidentelle, fournit un comportement par défaut sécurisé et est facile à adopter. Vous devez adopter ATS dès que possible, que vous créiez une nouvelle application ou que vous mettiez à jour une application existante.
Si vous développez une nouvelle application, vous devez utiliser HTTPS exclusivement. Si vous avez une application existante, vous devez utiliser HTTPS autant que possible en ce moment et créer un plan pour migrer le reste de votre application dès que possible.
Ajoutez ci-dessous la clé dans votre info.plist puis voyez.
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Même vous pouvez ajouter une exception spécifique,
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>testdomain.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<false/>
<key>NSExceptionAllowInsecureHTTPSLoads</key>
<false/>
<key>NSExceptionRequiresForwardSecrecy</key>
<true/>
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSThirdPartyExceptionAllowInsecureHTTPSLoads</key>
<false/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<true/>
<key>NSThirdPartyExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSRequiresCertificateTransparency</key>
<false/>
</dict>
...
</dict>
</dict>
Découvrez ce document que Apple fourni.
J'ai rencontré un problème similaire lors de l'exécution sur iOS 9 et ce que j'ai fait pour le corriger a été ajouté le dictionnaire NSAppTransportSecurity
à mon info.plist
fichier avec le NSAllowsArbitraryLoads
Bool
défini sur true
et après le nettoyage et la reconstruction, cela a fonctionné.
J'espère que ça aide!
Pour moi, le proxy bloquait, essayez d'utiliser Internet à partir d'une source différente pour résoudre le problème. Wifi, Lan, etc.
Avec iOS9, j'ai eu un même problème: alors que SSLlab le résultat n'a montré aucun problème avec les protocoles/chiffrements sur mon serveur, une connexion à une URL spécifique a échoué sur un iPad exécutant iOS/9.3.5 avec un SSL- Erreur:
Connection cannot be established.
Ma stupide erreur était que j'avais une redirection, c'est-à-dire dans NGINX (et similaire dans Apache):
rewrite /calendar $scheme://www.example.org/resources/calendar;
Si l'utilisateur accède à /calender
en définissant:
https://example.org/calendar
le serveur redirigé vers un autre domaine rompant l'établissement de la connexion SSL.
Définir la redirection comme suit l'a corrigé:
rewrite /calendar $scheme://$server_name/resources/calendar;