web-dev-qa-db-fra.com

iOS9 obtient une 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, le message d'erreur persiste:

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

93
Nanda

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>
102
Tony TRAN

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>
53
Stéphane Bruckert

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)

 enter image description here

14
TechSeeko

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>
12
Nathan Noble

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. : \

6
steve

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

2
Hashim Akhtar

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.

2
Helge Becker

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.

NSURLConnection obsolète dans iOS9

0
Akila Wasala

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.

0
Teena nath Paul