web-dev-qa-db-fra.com

Erreur SSL iOS 9 ATS avec serveur de prise en charge

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?

20
YogevSitton

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:

  1. TLS nécessite au moins la version 1.2.
  2. Les chiffrements de connexion sont limités à ceux qui fournissent le secret de retransmission (voir ci-dessous pour la liste des chiffrements.)
  3. Le service nécessite un certificat utilisant au moins une empreinte SHA256 avec une clé RSA de 2048 bits ou supérieure, ou une clé ECC (256 bits ou supérieure de courbe elliptique).
  4. Les certificats non valides entraînent une défaillance matérielle et aucune connexion.

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
31
YogevSitton

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>
11
Nilesh Patel

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 NSAllowsArbitraryLoadsBool défini sur true et après le nettoyage et la reconstruction, cela a fonctionné.

J'espère que ça aide!

5
user5082751

Pour moi, le proxy bloquait, essayez d'utiliser Internet à partir d'une source différente pour résoudre le problème. Wifi, Lan, etc.

2
Nagarjun

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;
0
Rainer Keller