web-dev-qa-db-fra.com

CFNetwork SSLHandshake a échoué sur iOS 9

est-ce que quelqu'un avec iOS 9 beta 1 a eu ce problème? 

J'utilise NSURLConnection standard pour me connecter à un service Web et dès qu'un appel est effectué vers le service Web, l'erreur ci-dessous apparaît. Cela fonctionne actuellement dans iOS 8.3

Possible bêta? des idées ou des pensées serait génial! Je sais que c'est très tôt dans le développement iOS 9

Voici l'erreur complète:

CFNetwork SSLHandshake a échoué (-9824) Échec du chargement HTTP de NSURLSession/NSURLConnection (kCFStreamErrorDomainSSL, -9824)

 NSURLRequest * urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"https://mywebserviceurl"]];
        NSURLResponse * response = nil;
        NSError * error = nil;
        NSData * data = [NSURLConnection sendSynchronousRequest:urlRequest
                                                  returningResponse:&response
                                                              error:&error];
203
user3099837

iOS 9 et OSX 10.11 requièrent TLSv1.2 SSL pour tous les hôtes à partir desquels vous prévoyez de demander des données, sauf si vous spécifiez des domaines d'exception dans le fichier Info.plist de votre application.

La syntaxe de la configuration Info.plist ressemble à ceci:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>yourserver.com</key>
    <dict>
      <!--Include to allow subdomains-->
      <key>NSIncludesSubdomains</key>
      <true/>
      <!--Include to allow insecure HTTP requests-->
      <key>NSExceptionAllowsInsecureHTTPLoads</key>
      <true/>
      <!--Include to specify minimum TLS version-->
      <key>NSExceptionMinimumTLSVersion</key>
      <string>TLSv1.1</string>
    </dict>
  </dict>
</dict>

Si votre application (un navigateur Web tiers, par exemple) doit se connecter à des hôtes arbitraires, vous pouvez la configurer comme suit:

<key>NSAppTransportSecurity</key>
<dict>
    <!--Connect to anything (this is probably BAD)-->
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

Si vous devez le faire, il est probablement préférable de mettre à jour vos serveurs pour qu'ils utilisent TLSv1.2 et SSL, s'ils ne le font pas déjà. Cela devrait être considéré comme une solution de contournement temporaire.

À ce jour, la documentation de la pré-version ne mentionne aucune de ces options de configuration de manière spécifique. Une fois que ce sera fait, je mettrai à jour la réponse afin de renvoyer à la documentation pertinente.

308
Steven Peterson

Dans iOS 10+, la chaîne TLS DOIT être de la forme "TLSv1.0". Ce ne peut pas être juste "1.0". (Soupir)


La combinaison suivante des autres réponses fonctionne.

Supposons que vous essayez de vous connecter à un hôte (YOUR_Host.COM) doté uniquement de TLS 1.0.

Ajoutez-les à l'Info.plist de votre application

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>YOUR_Host.COM</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>TLSv1.0</string>
            <key>NSTemporaryExceptionRequiresForwardSecrecy</key>
            <false/>
        </dict>
    </dict>
</dict>
64
Womble

Pour plus d'informations Configuration des exceptions de sécurité du transport d'application dans iOS 9 et OSX 10.11

Curieusement, vous remarquerez que la connexion tente de modifier le fichier protocole http à https pour vous protéger contre les erreurs dans votre code où vous avez peut-être mal configuré l'URL par inadvertance. Dans certains cas, cela pourrait effectivement fonctionner, mais c’est aussi déroutant.

This Envoi d'une application avec App Transport Security couvre quelques bons conseils de débogage

Échec ATS

La plupart des défaillances ATS se présenteront sous la forme CFErrors avec un code dans -9800 séries. Ceux-ci sont définis dans l'en-tête Security/SecureTransport.h

2015-08-23 06:34:42.700 SelfSignedServerATSTest[3792:683731] NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)

CFNETWORK_DIAGNOSTICS

Définissez la variable d'environnement CFNETWORK_DIAGNOSTICS sur 1 afin de permettre à obtenir plus d'informations sur la console à propos de l'échec

nscurl

L'outil passera par plusieurs combinaisons différentes d'ATS exceptions, en essayant une connexion sécurisée à l'hôte donné sous chaque Configuration ATS et rapport du résultat.

nscurl --ats-diagnostics https://example.com
33
onmyway133

Après deux jours de tentatives et d’échecs, ce qui a fonctionné pour moi est ce code de womble

avec un changement, selon ce post nous devrions cesser d’utiliser des sous-clés associées au dictionnaire NSExceptionDomains de ce type de convention

  NSTemporaryExceptionMinimumTLSVersion

Et utiliser à la nouvelle convention

  NSExceptionMinimumTLSVersion

au lieu.

Documentation Apple

mon code

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>YOUR_Host.COM</key>
            <dict>
                <key>NSExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSExceptionMinimumTLSVersion</key>
                <string>TLSv1.0</string>
                <key>NSExceptionRequiresForwardSecrecy</key>
                <false/>
                <key>NSIncludesSubdomains</key>
                <true/>
            </dict>
        </dict>
    </dict>
2
yehoni amran

Si votre serveur utilise une connexion sécurisée et que vous utilisez NSURLSession

CFNetwork SSLHandshake failed (-9801)
NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9801)

vous devez vérifier la configuration de votre serveur, notamment pour obtenir la version ATS et le certificat SSL:

Au lieu de simplement Autoriser les connexions non sécurisées en définissant NSExceptionAllowsInsecureHTTPLoads = YES, vous devez plutôt Autoriser la sécurité abaissée au cas où votre serveur ne respecte pas l'exigence minimale (v1.2) pour ATS (ou mieux pour réparer le côté serveur) . 

Autoriser une sécurité réduite sur un serveur unique

<key>NSExceptionDomains</key>
<dict>
    <key>api.yourDomaine.com</key>
    <dict>
        <key>NSExceptionMinimumTLSVersion</key>
        <string>TLSv1.0</string>
        <key>NSExceptionRequiresForwardSecrecy</key>
        <false/>
    </dict>
</dict>

utilisez le client openssl pour examiner le certificat et obtenir la configuration de votre serveur à l'aide du client openssl:

openssl s_client  -connect api.yourDomaine.com:port //(you may need to specify port or  to try with https://... or www.)

..find à la fin

SSL-Session:
    Protocol  : TLSv1
    Cipher    : AES256-SHA
    Session-ID: //
    Session-ID-ctx: 
    Master-Key: //
    Key-Arg   : None
    Start Time: 1449693038
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)

La sécurité du transport d'applications (ATS) nécessite le protocole 1.2 de la couche TLS (Transport Layer Security).

Conditions requises pour la connexion via ATS:

La configuration requise pour qu'une connexion de service Web utilise App Transport Security (ATS) implique le serveur, les chiffreurs de connexion et les certificats, comme suit:

Les certificats doivent être signés avec l'un des types de clés suivants:

  • Clé de l'algorithme de hachage sécurisé 2 (SHA-2) avec une longueur de résumé d'au moins 256 (c'est-à-dire, SHA-256 ou supérieur)
  • Clé de cryptographie à courbe elliptique (ECC) d'au moins 256 bits

  • Rivest-Shamir-Adleman (RSA) clé d’une longueur d’au moins 2048 bits An Un certificat invalide entraîne une défaillance matérielle et aucune connexion.

Les chiffreurs de connexion suivants prennent en charge le secret de transfert et le travail avec ATS:

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

Update: il s'avère que openssl ne fournit que la version de protocole minimale Protocol: TLSv1 links 

2
Idali

Un autre outil utile est nmap (brew install nmap)

nmap --script ssl-enum-ciphers -p 443 google.com

Donne la sortie 

Starting Nmap 7.12 ( https://nmap.org ) at 2016-08-11 17:25 IDT
Nmap scan report for google.com (172.217.23.46)
Host is up (0.061s latency).
Other addresses for google.com (not scanned): 2a00:1450:4009:80a::200e
PORT    STATE SERVICE
443/tcp open  https
| ssl-enum-ciphers: 
|   TLSv1.0: 
|     ciphers: 
|       TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) - A
|       TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (secp256r1) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
|     compressors: 
|       NULL
|     cipher preference: server
|   TLSv1.1: 
|     ciphers: 
|       TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) - A
|       TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (secp256r1) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
|     compressors: 
|       NULL
|     cipher preference: server
|   TLSv1.2: 
|     ciphers: 
|       TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 (secp256r1) - A
|       TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 (secp256r1) - A
|       TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 (secp256r1) - A
|       TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 (secp256r1) - A
|       TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (secp256r1) - A
|       TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
|       TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_AES_128_CBC_SHA256 (rsa 2048) - A
|       TLS_RSA_WITH_AES_128_GCM_SHA256 (rsa 2048) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA256 (rsa 2048) - A
|       TLS_RSA_WITH_AES_256_GCM_SHA384 (rsa 2048) - A
|     compressors: 
|       NULL
|     cipher preference: client
|_  least strength: C

Nmap done: 1 IP address (1 Host up) scanned in 5.48 seconds
1
Ryan Heitner

La syntaxe de la configuration 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 insecure HTTP requests-->
  <key>NSExceptionAllowsInsecureHTTPLoads</key>
  <true/>
  <!--Include to specify minimum TLS version-->
  <key>NSExceptionMinimumTLSVersion</key>
  <string>TLSv1.1</string>
   </dict>
 </dict>

0
ALOK KUMAR

L'appareil sur lequel j'ai testé a eu le mauvais réglage de l'heure. Ainsi, lorsque j'essayais d'accéder à une page avec un certificat qui s'épuisait rapidement, l'accès était refusé car le périphérique avait expiré. Pour réparer, définissez l'heure appropriée sur l'appareil!

0
Warpzit

Réponse mise à jour (après WWDC 2016):

les applications iOS nécessiteront des connexions HTTPS sécurisées d'ici la fin de 2016. Si vous essayez de désactiver ATS, votre application risque d'être rejetée à l'avenir.

App Transport Security, ou ATS, est une fonctionnalité introduite par iOS dans iOS 9. Lorsque ATS est activé, il oblige une application à se connecter aux services Web via une connexion HTTPS plutôt que via HTTP non sécurisé.

Toutefois, les développeurs peuvent toujours désactiver ATS et autoriser leurs applications à envoyer des données via une connexion HTTP, comme indiqué dans les réponses ci-dessus. À la fin de 2016, Apple rendra/ ATS obligatoire pour tous les développeurs qui souhaitent soumettre leurs applications à l'App Store. lien

Dans votre fichier de projet .plist, ajoutez cette permission:

<key>NSAppTransportSecurity</key>
<dict>
    <!--Connect to anything (this is probably BAD)-->
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
0
Hiren Dhamecha

Cette erreur apparaissait parfois dans les journaux lorsque j'utilisais une version buggy/crashy de Cordova iOS. Il est parti lorsque j'ai mis à niveau ou rétrogradé Cordova iOS.

Le serveur auquel je me connectais utilisait SSL TLSv1.2, alors je savais que ce n'était pas le problème.

0
im3r3k