web-dev-qa-db-fra.com

NSURLSession "échec du chargement HTTP kCFStreamErrorDomainSSL, -9813; certificat à signature automatique

J'essaie de connecter mon application iOS à un HTTPS Rails qui est actuellement exécutée sur un hôte local de mon réseau. Je peux accéder au site à partir de mon navigateur avec https://myIP:3000/display ainsi que dans la ligne de commande avec une requête curl. J'essaie d'y accéder depuis mon application en utilisant:

class FirstViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        //let url = NSURL(string: "https://another/Sinatra/website/feed")
        let url = NSURL(string: "https://myIP:3000/display")

        let request = NSURLRequest(URL: url!)
        let task = NSURLSession.sharedSession().dataTaskWithURL(url!)
        task!.resume()
    }

Lorsque j'essaie d'accéder au site Web de sinatra, je n'ai aucun problème et peux même imprimer le JSON sur la console avec les commandes appropriées. Cependant, lorsque je mets l'URL sur mon Rails), l'erreur suivante s'affiche.

Échec du chargement HTTP NSURLSession/NSURLConnection (kCFStreamErrorDomainSSL, -9813)

De plus, je peux dire que mon localhost Rails (sur l'autre ordinateur)] n'est pas envoyé depuis l'application iOS, mais par le navigateur et la commande curl.

Une idée de comment réparer ça?

42
Marcus

Si j'ai bien compris, Apple veut maintenant que les développeurs utilisent HTTPS et TLS 1.2 pour les appels réseau.

Temporaire , vous pouvez l'ajouter dans votre fichier "Info.plist":

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

Jetez un coup d’œil à ce lien, il pourrait également vous aider: http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/

-

Mise à jour : Suite à quelques commentaires, la solution ci-dessus ne fonctionne plus. Voici une solution mise à jour.

  1. Allez à votre Info.plist fichier.
  2. Ajouter une ligne de TypeDictionary et de KeyApp Transport Security Settings.
  3. Dans ce dictionnaire, ajoutez une ligne de TypeBoolean, de KeyAllow Arbitrary Loads et de valeurYES

-

Sinon, vous pouvez définir Domain Exceptions. Voici comment faire:

  1. Allez à votre Info.plist fichier.
  2. Ajouter une ligne de TypeDictionary et de KeyApp Transport Security Settings.
  3. Ajouter une ligne de TypeDictionary et de KeyException Domains.
  4. Ajouter une ligne de TypeDictionary et de KeyThe domain.
  5. Ajoutez deux lignes de TypeBoolean et de KeyNSExceptionAllowsInsecureHTTPLoads & NSIncludesSubdomains avec Valeur à YES.

Liens

https://forums.developer.Apple.com/message/5857#5857

2015 WWDC Session 711

Erreur de connexion HTTP iOS 9 - StackOverflow

42
Antoine

C'est un problème de confiance. Avec un certificat auto-signé, le composant de vérification d'identité de SSL ne fonctionne pas. Il est encore possible d'établir une connexion sécurisée de sorte que personne ne soit en train d'écouter, mais l'application ne peut pas savoir avec certitude qui se trouve à l'autre bout de la ligne.

J'ai une configuration similaire et j'ai résolu ce problème en ajoutant mon autorité de certification racine auto-signée aux certificats de confiance de l'iPad. Cette autorité de certification racine est utilisée pour signer tous mes autres certificats de développement. Ensuite, je dois juste ajouter ce certificat racine unique partout où SSL sera utilisé. Si vous utilisez directement un certificat auto-signé, vous pouvez probablement l'ajouter.

Pour obtenir le certificat sur l'appareil (ou le simulateur), je mets le fichier sur mon serveur Web. Ensuite, ouvrez-le simplement dans Safari via HTTP. L'application Paramètres devrait s'ouvrir et vous demander si vous souhaitez faire confiance au certificat.

Bien entendu, cela suppose qu’il s’agit uniquement de développement et que votre système de production dispose d’un certificat signé par une autorité connue (c’est-à-dire incluse dans la base de données des autorités de certification racine du système d’exploitation). Parce que demander aux utilisateurs finaux d'installer votre certificat auto-signé ne volera pas.

20
Brian

C’est la seule solution qui a fonctionné pour moi ... À la fin de votre fichier AppDelegate.m, insérez le code:

@implementation NSURLRequest(DataController)
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)Host
{
return YES;
}
@end

Merci pour jc ivancevich article http://ivancevich.me/articles/ignoring-invalid-ssl-certificates-on-cordova-Android-ios/

6
Anton P

(Edit - J'ai mal interprété cela comme 9814, cert. Expiré. Je ne sais pas comment résoudre celui-ci, mais j'espère que ma réponse aidera à aller dans la bonne direction.)

Ressemble à un problème de certificat différent de la question habituelle "Autoriser les charges arbitraires".

Bref extrait de: Documentation Apple - Annexe A: Erreurs d’évaluation de la confiance mutuelle des serveurs

NSOSStatusErrorDomain errSSLNoRootCert -9813

1
The Problem

essayez de changer la variable de session, ce changement m'aide

let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)
1
Margaret López

La modification du fichier info.plist a également fonctionné pour moi.

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