Depuis que j'ai mis à niveau mon projet existant avec iOS 9, le message d'erreur persiste:
Une erreur SSL s'est produite et une connexion sécurisée au serveur ne peut pas être établie.
Pour iOS9, Apple a pris une décision radicale avec iOS 9, en désactivant tout le trafic HTTP non sécurisé provenant d'applications iOS dans le cadre de App Transport Security (ATS) .
Pour simplement désactiver ATS, vous pouvez suivre cette procédure 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 entièrement désactiver 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 oblige les connexions utilisant 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 le 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 ne ciblez que 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 rompt les demandes adressées aux points de terminaison HTTPS valides. Actuellement, je soupçonne 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 bien sûr, ils ont un cert SHA-256):
location.href = "https://google.com"
// no problemo
Ajouter une exception à la sécurité des transports (comme indiqué dans la réponse de @ stéphane-bruckert ci-dessus) permet de résoudre ce problème. Je suppose également que le fait de désactiver complètement NSAppTransportSecurity
fonctionnerait également, bien que je l’ais lu, le désactiver complètement pourrait compromettre la révision de votre application.
[EDIT] J'ai constaté qu'énumérer simplement les domaines auxquels je me connecte dans le dict NSExceptionDomains
résout ce problème, même en laissant NSExceptionAllowsInsecureHTTPLoads
défini sur true. : \
La même erreur se produit lorsque je spécifie mon URL HTTPS sous la forme: https://www.mywebsite.com . Cependant, cela fonctionne bien lorsque je le spécifie sans les trois W comme: https://mywebsite.com .
Le problème est le certificat SSL sur le serveur. Quelque chose interfère ou 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 est exécuté sur myservice.mydomain.com. C'est une machine différente.
Projet Xcode -> Aller à info.plist et cliquer + bouton puis Ajouter (Paramètres de sécurité du transport d'application) Développez, Autorisez les charges arbitraires, définissez YES. Merci
Mon problème était NSURLConnection
et qui était obsolète dans iOS9, j'ai donc remplacé toutes les API par NSURLSession
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. Alors, vérifiez aussi ce cas lorsque vous faites face à une erreur SSL.