iOS9 obtient une erreur "une erreur SSL s'est produite et une connexion sécurisée au serveur ne peut pas être établie"

Réponses:

123

Pour iOS9, Apple a pris une décision radicale avec iOS 9, en désactivant tout le trafic HTTP non sécurisé des applications iOS, dans le cadre de App Transport Security (ATS) .

Pour désactiver simplement ATS, vous pouvez suivre ces étapes en ouvrant Info.plist et en ajoutant les lignes suivantes:

<key>NSAppTransportSecurity</key>
  <dict>
      <key>NSAllowsArbitraryLoads</key>
      <true/>
  </dict>
Tony TRAN
la source
46
J'ai ajouté les lignes ci-dessus dans plist, mais j'obtiens toujours l'erreur suivante: Une erreur SSL s'est produite et une connexion sécurisée au serveur ne peut pas être établie. NSLocalizedRecoverySuggestion = Voulez-vous quand même vous connecter au serveur ?, _kCFNetworkCFStreamSSLErrorOriginalValue = -9819 J'appelle la requête HTTPS. Existe-t-il une autre option pour HTTPS?
AiOsN
1
AiOsN = même problème ici, avez-vous trouvé une solution?
Franck
5
Il semble être une mauvaise interprétation courante, que NSAllowsArbitraryLoads est un commutateur pour activer ou désactiver ATS. Dès que vous effectuez une requête https: //, vous devez vous assurer que vous répondez aux exigences ATS: un certificat valide installé sur le serveur (sans joker, correspondant exactement au nom de domaine du serveur), le serveur prend en charge TLS 1.2 avec forward secret.
Christian
@Christian Quelle est la source de ces exigences ATS? Je ne trouve rien sur la non prise en charge des certificats génériques.
Bart
@Bartosz Désolé, je ne peux pas vous diriger vers un document officiel, c'est juste quelque chose que nous avons observé lors de la mise à jour de notre infrastructure de serveur.
Christian
64

Même si autoriser des charges arbitraires ( NSAllowsArbitraryLoads = true) est une bonne solution de contournement, vous ne devez pas désactiver complètement ATS mais plutôt activer la connexion HTTP que vous souhaitez autoriser:

<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>
Stéphane Bruckert
la source
2
Bien mieux que d'ignorer tous les problèmes de sécurité. Le service S3 d'Amazon utilise un cryptage faible et le chargement directement sur leurs serveurs posait des problèmes, mais cela nous permettait d'ouvrir uniquement l'url s3.amazonaws.com, en gardant le reste en ligne. Impressionnant!
mix3d
3
Le serveur que j'essayais d'atteindre utilisait TLSv1.0. J'ai dû ajouter NSExceptionMinimumTLSVersion pour tls1.0 pour contourner l'erreur SLL
Ispas Claudiu
Cette réponse a fonctionné pour moi. J'utilisais un WKWebView et j'essayais de faire une demande SSL au serveur API.
Fan Jin
Salut @ Stéphane, j'ai une situation étrange. Mon téléphone utilise la version iOS 12.1.2, mais j'ai reçu l'erreur "Une erreur SSL s'est produite et une connexion sécurisée au serveur ne peut pas être établie". Ce que j'ai fait, c'est mettre à jour mon fichier plist. L'application fonctionne bien et encore une fois, j'ai supprimé les modifications que j'ai apportées à info.plist. Maintenant ça marche bien. Donc, je ne suis pas en mesure de trouver la raison réelle de cette erreur. Toute suggestion?
Mansuu ....
@Mansuu .... avez-vous essayé d'utiliser TLSv1.0 comme suggéré dans les commentaires ci-dessus?
Stéphane Bruckert
15

iOS 9 force les connexions qui utilisent HTTPS à être TLS 1.2 pour éviter les vulnérabilités récentes. Dans iOS 8, même les connexions HTTP non chiffrées étaient prises en charge, de sorte que les anciennes versions de TLS ne posaient aucun problème non plus. Pour contourner ce problème, vous pouvez ajouter cet extrait de code à votre Info.plist:

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

* référencé à App Transport Security (ATS)

entrez la description de l'image ici

TechSeeko
la source
1
Pour Swift 4+, Paramètres de sécurité du transport de l'application -> Autoriser les charges arbitraires = OUI
mehdigriche
14

Si vous ciblez uniquement des domaines spécifiques, vous pouvez essayer d'ajouter ceci dans Info.plist de votre application:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>
Nathan Noble
la source
Cela n'a pas fonctionné pour moi. Oui, j'ai mis le bon domaine pour "example.com".
Alyoshak
1
C'est du travail pour moi. quand j'ai fait l'exemple uniquement avec le "Autoriser les charges arbitraires" fonctionne mais après arrêté. Quand j'ai utilisé la clé "NSExceptionRequiresForwardSecrecy" -> false et "NSIncludesSubdomains" -> true cela fonctionne parfaitement. Merci beaucoup!
linhadiretalipe
1
Cela a fonctionné pour moi aussi! Même si j'utilise une connexion https, j'ai toujours rencontré le problème. Il n'y a actuellement aucune prise en charge pour «NSExceptionRequiresForwardSecrecy». D'après ce que j'ai lu, il n'était pas nécessaire de le spécifier plus tôt, mais il semble qu'ils l'ont également rendu obligatoire maintenant. PS: J'essayais avec iOS 10.2.1
Vaibhav Misra
6

Il semble qu'iOS 9.0.2 interrompt les demandes aux points de terminaison HTTPS valides. Mon soupçon actuel est qu'il nécessite des certificats SHA-256 ou qu'il échoue avec cette erreur.

Pour reproduire, inspectez votre UIWebView avec safari et essayez de naviguer vers un point de terminaison HTTPS arbitraire:

location.href = "https://d37gvrvc0wt4s1.cloudfront.net/js/v1.4/rollbar.min.js"
// [Error] Failed to load resource: An SSL error has occurred and a secure connection to the server cannot be made. (rollbar.min.js, line 0)

Maintenant, essayez d'aller sur Google (car ils ont bien sûr un certificat SHA-256):

location.href = "https://google.com"
// no problemo

L'ajout d'une exception à la sécurité du transport (comme indiqué par la réponse de @ stéphane-bruckert ci-dessus) permet de résoudre ce problème. Je suppose également que la désactivation complète NSAppTransportSecurityfonctionnerait également, même si j'ai lu que la désactivation complète peut compromettre l'examen de votre application.

[EDIT] J'ai trouvé que le simple fait d'énumérer les domaines auxquels je me connecte dans le NSExceptionDomainsdict résout ce problème, même en laissant NSExceptionAllowsInsecureHTTPLoadsla valeur true. : \

Steve
la source
2

Le problème est le certificat ssl côté serveur. Soit quelque chose interfère, soit le certificat ne correspond pas au service. Par exemple, lorsqu'un site a un certificat SSL pour www.mondomaine.com alors que le service que vous utilisez s'exécute sur myservice.mydomain.com. C'est une machine différente.

Helge Becker
la source
Je reçois le problème avec certaines URL mais pas d'autres à la même adresse IP (domaine et serveur)
user6631314
0

Projet Xcode -> goto info.plist et cliquez sur + bouton puis sur Ajouter (Paramètres de sécurité du transport d'application) Développer, autoriser les charges arbitraires Définir OUI. Merci

Shanmugasundharam
la source
@AbdulYasin vérifier votre plist et vérifier que les changements météorologiques sont mis à jour ou non?
Shanmugasundharam
1
Cette réponse «décontractée» omet totalement l'explication et les risques de sécurité associés à cette solution de contournement.
Manuel
0

Dans mon cas, j'ai rencontré ce problème dans mon simulateur car la date de mon ordinateur était en retard par rapport à la date actuelle. Vérifiez donc également ce cas lorsque vous rencontrez une erreur SSL.

Teena nath Paul
la source
0

J'obtenais une erreur en dessous de la lecture

finished with error [-1200] Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." UserInfo={NSErrorFailingURLStringKey=https://remote-abcabc-svc.an.abc.com:1935/abr/_definst_/smil:v2/video/492F2F82592F59EA74ABAA6B9D6E6F42/F6B1BD452132329FBACD32730862CAE0/091EAD80FE9BEDD52A2F33840CA3CBAC.v3.eng.smil/playlist.m3u8, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _kCFStreamErrorDomainKey=3, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <692A1174-DA1C-4267-9560-9020A79F8458>.<1>, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalDataTask <692A1174-DA1C-4267-9560-9020A79F8458>

Je me suis assuré que j'ai ajouté une entrée dans les domaines d'exception dans le fichier plist et que NSAllowsArbitraryLoads est défini sur true et je voyais toujours une erreur.

Puis j'ai réalisé que je jouais à l'URL avec https et non avec http.

J'ai défini l'URL de la vidéo sur http et le problème est résolu.

Naren
la source
0

J'obtenais cette erreur pour certains appels réseau et pas pour d'autres. J'étais connecté à un wifi public. Ce wifi gratuit semblait altérer certaines URL et donc l'erreur.

Lorsque je me suis connecté à LTE, cette erreur a disparu!

Mon chéri
la source