J'ai le code simple suivant pour me connecter à une page Web SSL
NSMutableURLRequest *urlRequest=[NSMutableURLRequest requestWithURL:url];
[ NSURLConnection sendSynchronousRequest: urlRequest returningResponse: nil error: &error ];
Sauf qu'il donne une erreur si le certificat est auto-signé Error Domain=NSURLErrorDomain Code=-1202 UserInfo=0xd29930 "untrusted server certificate".
Existe-t-il un moyen de le configurer pour accepter les connexions de toute façon (tout comme dans un navigateur, vous pouvez appuyer sur Accepter) ou un moyen de le contourner?
-(void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
méthode doit être utilisée à la place.Si vous n'êtes pas disposé (ou incapable) d'utiliser des API privées, il existe une bibliothèque open source (licence BSD) appelée ASIHTTPRequest qui fournit un wrapper autour du niveau inférieur
CFNetwork APIs
. Ils ont récemment introduit la possibilité d'autoriser l'HTTPS connections
utilisation de certificats auto-signés ou non approuvés avec l'-setValidatesSecureCertificate:
API. Si vous ne voulez pas récupérer toute la bibliothèque, vous pouvez utiliser la source comme référence pour implémenter vous-même la même fonctionnalité.la source
Idéalement, il ne devrait y avoir que deux scénarios dans lesquels une application iOS devrait accepter un certificat non approuvé.
Scénario A: vous êtes connecté à un environnement de test qui utilise un certificat auto-signé.
Scénario B: vous utilisez le
HTTPS
trafic proxy à l'aide d'unMITM Proxy like Burp Suite, Fiddler, OWASP ZAP, etc.
proxy Les proxy renverront un certificat signé par une autorité de certification auto-signée afin que le proxy puisse capturer leHTTPS
trafic.Les hôtes de production ne doivent jamais utiliser de certificats non approuvés pour des raisons évidentes .
Si vous avez besoin que le simulateur iOS accepte un certificat non approuvé à des fins de test, il est fortement recommandé de ne pas modifier la logique d'application afin de désactiver la validation de certificat intégrée fournie par le
NSURLConnection
API. Si l'application est mise à la disposition du public sans supprimer cette logique, elle sera sensible aux attaques de l'homme du milieu.La méthode recommandée pour accepter des certificats non approuvés à des fins de test consiste à importer le certificat de l'autorité de certification (CA) qui a signé le certificat sur votre simulateur iOS ou votre appareil iOS. J'ai rédigé un petit article de blog qui montre comment faire cela sur un simulateur iOS:
acceptation de certificats non approuvés à l'aide du simulateur ios
la source
NSURLRequest
a une méthode privée appeléesetAllowsAnyHTTPSCertificate:forHost:
, qui fera exactement ce que vous souhaitez. Vous pouvez définir laallowsAnyHTTPSCertificateForHost:
méthodeNSURLRequest
via une catégorie et la définir pour renvoyerYES
l'hôte que vous souhaitez remplacer.la source
Pour compléter la réponse acceptée, pour une bien meilleure sécurité, vous pouvez ajouter votre certificat de serveur ou votre propre certificat d'autorité de certification racine au trousseau ( https://stackoverflow.com/a/9941559/1432048 ), mais cela ne suffira pas à rendre NSURLConnection authentifiez votre serveur auto-signé automatiquement. Vous devez toujours ajouter le code ci-dessous à votre délégué NSURLConnection, il est copié à partir de l'exemple de code Apple AdvancedURLConnections , et vous devez ajouter deux fichiers (Credentials.h, Credentials.m) à partir de l'exemple de code Apple à vos projets.
la source
Je ne peux pas prendre de crédit pour cela, mais celui que j'ai trouvé fonctionnait très bien pour mes besoins.
shouldAllowSelfSignedCert
est maBOOL
variable. Ajoutez simplement à votreNSURLConnection
délégué et vous devriez être rockin pour un contournement rapide sur une base par connexion.la source
Dans iOS 9, les connexions SSL échoueront pour tous les certificats non valides ou auto-signés. Il s'agit du comportement par défaut de la nouvelle fonctionnalité App Transport Security dans iOS 9.0 ou version ultérieure, et sur OS X 10.11 et version ultérieure.
Vous pouvez remplacer ce comportement dans le
Info.plist
, en définissantNSAllowsArbitraryLoads
surYES
dans leNSAppTransportSecurity
dictionnaire. Cependant, je recommande de remplacer ce paramètre à des fins de test uniquement.Pour plus d'informations, voir App Transport Technote ici .
la source
La solution de contournement de catégorie publiée par Nathan de Vries passera les vérifications de l'API privée AppStore et est utile dans les cas où vous n'avez pas le contrôle de l'
NSUrlConnection
objet. Un exemple est celuiNSXMLParser
qui ouvrira l'URL que vous fournissez, mais n'expose pas leNSURLRequest
ouNSURLConnection
.Dans iOS 4, la solution de contournement semble toujours fonctionner, mais uniquement sur l'appareil, le simulateur n'invoque plus la
allowsAnyHTTPSCertificateForHost:
méthode.la source
Vous devez utiliser
NSURLConnectionDelegate
pour autoriser les connexions HTTPS et il y a de nouveaux rappels avec iOS8.Obsolète:
Au lieu de cela, vous devez déclarer:
Avec,
willSendRequestForAuthenticationChallenge
vous pouvez utiliserchallenge
comme vous l'avez fait avec les méthodes obsolètes, par exemple:la source
J'ai posté un code essentiel (basé sur le travail de quelqu'un d'autre que je note) qui vous permet de vous authentifier correctement contre un certificat auto-généré (et comment obtenir un certificat gratuit - voir les commentaires en bas de Cocoanetics )
Mon code est ici github
la source
Si vous souhaitez continuer à utiliser sendSynchronousRequest, je travaille dans cette solution:
vous pouvez le voir ici: Connexion Synchrone SSL Objective-C
la source
Avec AFNetworking, j'ai utilisé avec succès le service Web https avec le code ci-dessous,
la source
Vous pouvez utiliser ce code
Utiliser à la
-connection:willSendRequestForAuthenticationChallenge:
place de ces méthodes obsolètesObsolète:
la source