web-dev-qa-db-fra.com

Échec du chargement HTTP (kCFStreamErrorDomainSSL, -9813) dans l'application Cordova

J'ai créé une application iOS avec Cordova 3.2 et jquery mobile 1.3. J'utilise jquery ajax pour envoyer des demandes à un service RESTfull pour récupérer/mettre à jour des informations.

J'ai un certain nombre d'appareils de test, divers iPhones, avec différentes versions iOS différentes. Sur un iPhone 4S, exécutant iOS 7, je reçois l'erreur suivante lorsqu'une demande ajax est envoyée:

NSURLConnection/CFURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)

Cela ne se produit que sur cet appareil, sur un autre iPhone 4S, exécutant également iOS 7, cela fonctionne parfaitement, comme c'est le cas sur tous les autres appareils de test que j'utilise.

J'ai lu que cela indique que le certificat n'est pas valide d'une manière ou d'une autre, cela étant le cas, cela peut-il être ignoré et pourquoi cela affecterait-il un appareil?

Quelqu'un peut-il suggérer pourquoi cela pourrait se produire et ce qui pourrait être différent sur l'appareil qui l'empêcherait de fonctionner uniquement sur l'un de mes appareils. Merci

18
Martin Cassidy

Si cela fonctionne sur certains appareils et pas sur d'autres, il y a une différence dans les paramètres de validation de certificat pour ces appareils. Voici quelques éléments à considérer:

  1. Les appareils heureux ont-ils un certificat racine que les appareils malheureux n'ont pas? En particulier, s'ils exécutent différentes versions d'iOS, ils peuvent également avoir différentes listes de certificats de confiance. Essayez d'aller dans Paramètres> Général> À propos et comparez les chiffres de "Trust Store" tout en bas. Voir plus d'informations ici .
  2. Avez-vous accepté manuellement un certificat intermédiaire (utilisé pour signer ce certificat) sur les appareils heureux à un moment donné dans le passé? *
  3. La date/l'heure est-elle incorrecte sur l'appareil malheureux? S'il est défini sur une heure après la date d'expiration du certificat ou avant la date d'émission du certificat, il le rejettera. Je me tire toujours une balle dans le pied avec celui-ci!

Si vous accédez à l'URL de votre point de terminaison dans le navigateur de l'appareil malheureux, quelle erreur cela vous donne-t-il? (Remarque: évidemment, votre serveur vous donnera également une erreur parce que vous ne demandez pas avec les bons en-têtes et paramètres. Je parle de Safari lui-même, cependant - il devrait donner un message plus détaillé sur ce qu'il (pense)) mal avec le certificat.)

* Modifié pour corriger quelque chose dont je me suis souvenu: vous n'avez pas la possibilité d'accepter le certificat feuille si vous allez à l'URL dans Safari, vous n'avez que le possibilité d'accepter des certificats intermédiaires si vous essayez de les charger directement.

12
Arkaaito

J'ai eu un problème similaire, mais dans mon cas, sur tous les appareils, cela se produisait et uniquement lors d'un appel ajax avec https.

Si tel est votre cas, l'ajout du code ci-dessous à la fin du fichier appDelegate.m atténuera votre problème.

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

Mais je doute que si cela fonctionne dans d'autres appareils, la solution que j'ai donnée pourrait ne pas être efficace. Mais essayez-le.

33
Markiv

La version Swift de réponse Markivs (tirée de ici ):

extension NSURLRequest {
    static func allowsAnyHTTPSCertificateForHost(Host: String) -> Bool {
        return true
    }
}
2
Chris

Xcode 7.3 Swift 2.2

Pour que cela fonctionne, je devais faire 3 choses:

  1. J'ai dû ajouter la réponse de Chris ^ au bas de l'AppDelegate.Swift après la fermeture} pour la classe
  2. puis modifiez Info.plist en utilisant cette réponse https://stackoverflow.com/a/3270169
  3. Assurez-vous de définir un nom de domaine pour le serveur au lieu d'une adresse IP
2
Brewster

J'ai eu le même problème lors de l'exécution de l'application dans le simulateur. La raison derrière cela est qu'il n'y a pas de certificat de confiance dans le simulateur.

faites simplement glisser et déposez vos fichiers .cer dans votre fenêtre Simulator en cours d'exécution. Vous verrez Safari clignoter, puis la boîte de dialogue d'importation de votre certificat (ou autorité de certification) ...

1
user3540599