NSURLSession "HTTP échec de chargement de la kCFStreamErrorDomainSSL, -9813 ; Auto certificat de signature
J'essaie de connecter mon application iOS de un HTTPS application Rails qui est actuellement exécuté sur un hôte local dans 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 demande curl. Je suis en train d'y accéder à partir de 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 à la sinatra site je n'ai aucun problème et peut même imprimer au format JSON à la console avec les commandes appropriées. Cependant, lorsque j'ai mis l'url de mon Rails de site web, j'obtiens l'erreur suivante.
NSURLSession/NSURLConnection HTTP échec de chargement (kCFStreamErrorDomainSSL, -9813)
En outre, je peux dire que mon localhost application Rails (sur l'autre machine) n'est pas une requête ping à partir de l'application iOS, mais est activée à partir du navigateur et de la commande curl.
Toutes les idées de comment résoudre ce problème?
- Mettre votre code dans
viewWillDisplay
ouviewDidDisplay
.viewDidLoad
est trop tôt pour la plupart des choses. - Qui iOS et Swift version? Ajouter cette information à la question.
- double possible de CFNetwork SSLHandshake échoué iOS 9 Beta 1
- double possible de NSURLSession/NSURLConnection HTTP échec de chargement de la
- Arrive aussi en Objective-C (pas seulement sur swift)
Vous devez vous connecter pour publier un commentaire.
Si j'ai bien compris, Apple veut maintenant les développeurs à utiliser le protocole HTTPS et TLS 1.2 pour les appels réseau.
Temporaire, vous pouvez les ajouter dans votre "Info.plist" fichier :
Juste un coup d'oeil à ce lien, il peut également vous aider à : http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/
--
Mise à jour : à la Suite de certains commentaires la solution ci-dessus n'est pas plus de travail. Voici une mise à jour de la solution.
Info.plist
fichier.Dictionary
et de CléApp Transport Security Settings
.Boolean
, de CléAllow Arbitrary Loads
et de ValeurYES
-
Sinon, vous pouvez définir
Domain Exceptions
. C'est la façon de faire :Info.plist
fichier.Dictionary
et de CléApp Transport Security Settings
.Dictionary
et de CléException Domains
.Dictionary
et de CléThe domain
.Boolean
et de CléNSExceptionAllowsInsecureHTTPLoads
&NSIncludesSubdomains
avec Valeur àYES
.Liens
https://forums.developer.apple.com/message/5857#5857
2015 de la WWDC Session 711
iOS 9 HTTP Erreur de Connexion - StackOverflow
C'est une question de confiance. Avec un certificat auto-signé, la vérification de l'identité du composant de SSL ne fonctionne pas. Il est toujours possible d'établir une connexion sécurisée afin que personne n'est à l'écoute, mais l'app ne peut pas être sûr de qui est à l'autre bout de la ligne.
J'en ai un similaire de l'installation, et résolu ce problème en ajoutant mon auto-signé de l'autorité de certification racine de l'iPad certificats approuvés. Cette autorité de certification racine est utilisée pour signer tous mes autres certificats de développement. Ensuite, j'ai juste à ajouter de ce seul certificat racine de n'importe où que SSL sera utilisé. Si vous venez d'avoir un certificat auto-signé que vous utilisez directement, vous pouvez probablement juste ajouter que.
Pour obtenir le certificat sur l'appareil (ou simulateur), j'ai mis le fichier sur mon serveur web. Ensuite, il suffit de l'ouvrir dans Safari sur HTTP normal. Les Paramètres de l'application devrait s'ouvrir et vous demander si vous souhaitez faire confiance au certificat.
Bien sûr, c'est en supposant que c'est pour le développement, et que votre système de production a un certificat signé par une autorité bien connue (c'est à dire celle qui est incluse dans l'OS de la base de données des autorités de certification racine). Parce que demander à l'utilisateur final d'installer votre certificat auto-signé de ne pas voler.
.crt
C'est la seule solution qui a fonctionné pour moi... À la fin de votre AppDelegate.m fichier, insérez le code:
Merci pour jc ivancevich article http://ivancevich.me/articles/ignoring-invalid-ssl-certificates-on-cordova-android-ios/
(Edit - j'ai mal lu ce que 9814, expiré cert. Je ne sais pas comment résoudre ce problème, mais j'espère que ma réponse permet de pointer dans la bonne direction.)
Ressemble à un cert problème différent de l'habituel "Permettre à l'Arbitraire des Charges" de la question.
Bref extrait de: La Documentation D'Apple - Annexe A: Commune Serveur De Confiance Erreurs D'Évaluation De La
NSOSStatusErrorDomain errSSLNoRootCert -9813
essayez de changer la variable de session, ce changement m'aider
La modification de l'info.plist a travaillé pour moi aussi.
NSURLSession/NSURLConnection HTTP échec de chargement (kCFStreamErrorDomainSSL, -9813)
Ajouter une nouvelle ligne dans votre fichier plist.