298 votes

Comment utiliser NSURLConnection pour se connecter avec le protocole SSL pour un non approuvés cert?

J'ai le code simple suivant pour vous 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 cert est une auto-signé un Error Domain=NSURLErrorDomain Code=-1202 UserInfo=0xd29930 "untrusted server certificate". Est-il un moyen de configurer pour accepter les connexions de toute façon (comme dans un navigateur, vous pouvez appuyez sur accepter) ou un moyen de le contourner?

415voto

Gordon Henriksen Points 3437

Il y a une API pris en charge pour la réalisation de cet! Ajouter quelque chose comme ceci à votre NSURLConnection délégué:

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace {
  return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust];
}

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
  if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust])
    if ([trustedHosts containsObject:challenge.protectionSpace.host])
      [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];

  [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
}

Notez que connection:didReceiveAuthenticationChallenge: peut envoyer son message de défi.expéditeur (beaucoup) plus tard, après avoir présenté une boîte de dialogue à l'utilisateur si nécessaire, etc.

36voto

Nathan de Vries Points 10895

Si vous êtes disposé (ou l'impossibilité) d'utiliser des Api privées, il y a un open source (licence BSD) bibliothèque appelée ASIHTTPRequest qui fournit un wrapper autour de la baisse du niveau de l' CFNetwork APIs. Ils ont récemment introduit la possibilité d'autoriser HTTPS connections moyen de l'auto-signé ou de certificats non fiables avec l' -setValidatesSecureCertificate: API. Si vous ne voulez pas tirer dans l'ensemble de la bibliothèque, vous pouvez utiliser la source comme référence pour la mise en œuvre de la même fonctionnalité vous-même.

33voto

user890103 Points 249

Idéalement, il devrait être seulement deux scénarios de quand une application iOS devraient accepter des nations unies certificat de confiance.

Le scénario: Vous êtes connecté à un environnement de test qui utilise un certificat auto-signé.

Scénario B: Vous êtes le Proxy HTTPS du trafic à l'aide d'un MITM Proxy like Burp Suite, Fiddler, OWASP ZAP, etc. Les Procurations sera de retour un certificat signé par une auto-signé CA sorte que le proxy est capable de capturer HTTPS du trafic.

Hôtes de Production ne doivent jamais utiliser de non-confiance des certificats pour des raisons évidentes.

Si vous avez besoin d'avoir le simulateur iOS, d'accepter des nations unies-certificat de confiance pour des fins de test, il est fortement recommandé que vous ne modifiez pas la logique de l'application afin de désactiver le haut dans la validation de certificat fourni par l' NSURLConnection Api. Si la demande est communiquée au public sans enlever cette logique, il sera sensible à man-in-the-middle attaques.

La méthode recommandée pour accepter des nations unies-certificats approuvés à des fins de test consiste à importer le Certificat de l'Autorité de certification(CA) certificat qui a signé le certificat sur votre Simulateur iOS ou iOS dispositif. J'ai écrit un rapide billet de blog qui explique comment faire ce qui un Simulateur iOS:

l'acceptation de certificats non fiables en utilisant le simulateur ios

12voto

Nathan de Vries Points 10895

NSURLRequest a une méthode privée appelés setAllowsAnyHTTPSCertificate:forHost:, ce qui permettra de faire exactement ce que vous souhaitez. Vous pouvez définir l' allowsAnyHTTPSCertificateForHost: méthode NSURLRequest via une catégorie, et le mettre à revenir YES pour l'hôte que vous souhaitez remplacer.

10voto

Ryna Points 396

Je ne peux pas prendre tout le crédit pour cela, mais ce que j'ai trouvé vraiment bien fonctionné pour mes besoins. shouldAllowSelfSignedCert mon BOOL variable. Il suffit d'ajouter à votre NSURLConnection délégué et vous devriez être rockin pour un rapide dérivation sur une base par connexion.

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)space {
     if([[space authenticationMethod] isEqualToString:NSURLAuthenticationMethodServerTrust]) {
          if(shouldAllowSelfSignedCert) {
               return YES; // Self-signed cert will be accepted
          } else {
               return NO;  // Self-signed cert will be rejected
          }
          // Note: it doesn't seem to matter what you return for a proper SSL cert
          //       only self-signed certs
     }
     // If no other authentication is required, return NO for everything else
     // Otherwise maybe YES for NSURLAuthenticationMethodDefault and etc.
     return NO;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X