Depuis que j'ai mis à niveau mon projet existant avec iOS 9, j'obtiens l'erreur:
Une erreur SSL s'est produite et une connexion sécurisée au serveur ne peut pas être établie.
Depuis que j'ai mis à niveau mon projet existant avec iOS 9, j'obtiens l'erreur:
Une erreur SSL s'est produite et une connexion sécurisée au serveur ne peut pas être établie.
Réponses:
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>
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>
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)
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>
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 NSAppTransportSecurity
fonctionnerait é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 NSExceptionDomains
dict résout ce problème, même en laissant NSExceptionAllowsInsecureHTTPLoads
la valeur true. : \
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.
J'obtiens la même erreur lorsque je spécifie mon URL HTTPS comme suit : https://www.mywebsite.com . Cependant, cela fonctionne bien lorsque je le spécifie sans les trois W comme: https://mywebsite.com .
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
Mon problème était NSURLConnection
et c'était obsolète dans iOS9, j'ai donc changé toute l'API enNSURLSession
et cela a résolu mon problème.
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.
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.