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?
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.
Info.plist
fichier.Dictionary
et de KeyApp Transport Security Settings
.Boolean
, de KeyAllow Arbitrary Loads
et de valeurYES
-
Sinon, vous pouvez définir Domain Exceptions
. Voici comment faire:
Info.plist
fichier.Dictionary
et de KeyApp Transport Security Settings
.Dictionary
et de KeyException Domains
.Dictionary
et de KeyThe domain
.Boolean
et de KeyNSExceptionAllowsInsecureHTTPLoads
& NSIncludesSubdomains
avec Valeur à YES
.Liens
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.
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/
(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
essayez de changer la variable de session, ce changement m'aide
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)
La modification du fichier info.plist a également fonctionné pour moi.
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>