How to use NSURLConnection to connect with SSL for an untrusted cert?

后端 未结 13 1591
盖世英雄少女心
盖世英雄少女心 2020-11-22 01:29

I have the following simple code to connect to a SSL webpage

NSMutableURLRequest *urlRequest=[NSMutableURLRequest requestWithURL:url];
[ NSURLConnection send         


        
相关标签:
13条回答
  • 2020-11-22 01:40

    With AFNetworking I have successfully consumed https webservice with below code,

    NSString *aStrServerUrl = WS_URL;
    
    // Initialize AFHTTPRequestOperationManager...
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    manager.requestSerializer = [AFJSONRequestSerializer serializer];
    manager.responseSerializer = [AFJSONResponseSerializer serializer];
    
    [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    manager.securityPolicy.allowInvalidCertificates = YES; 
    [manager POST:aStrServerUrl parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject)
    {
        successBlock(operation, responseObject);
    
    } failure:^(AFHTTPRequestOperation *operation, NSError *error)
    {
        errorBlock(operation, error);
    }];
    
    0 讨论(0)
  • 2020-11-22 01:42

    If you're unwilling (or unable) to use private APIs, there's an open source (BSD license) library called ASIHTTPRequest that provides a wrapper around the lower-level CFNetwork APIs. They recently introduced the ability to allow HTTPS connections using self-signed or untrusted certificates with the -setValidatesSecureCertificate: API. If you don't want to pull in the whole library, you could use the source as a reference for implementing the same functionality yourself.

    0 讨论(0)
  • 2020-11-22 01:43

    If you want to keep using sendSynchronousRequest i work in this solution:

    FailCertificateDelegate *fcd=[[FailCertificateDelegate alloc] init];
    
    NSURLConnection *c=[[NSURLConnection alloc] initWithRequest:request delegate:fcd startImmediately:NO];
    [c setDelegateQueue:[[NSOperationQueue alloc] init]];
    [c start];    
    NSData *d=[fcd getData];
    

    you can see it here: Objective-C SSL Synchronous Connection

    0 讨论(0)
  • 2020-11-22 01:50

    I posted some gist code (based on someone else's work which I note) that lets you properly authenticate against a self generated certificate (and how to get a free certificate - see comments bottom of Cocoanetics)

    My code is here github

    0 讨论(0)
  • 2020-11-22 01:52

    The category workaround posted by Nathan de Vries will pass the AppStore private API checks, and is useful in cases where you do not have control of the NSUrlConnection object. One example is NSXMLParser which will open the URL you supply, but does not expose the NSURLRequest or NSURLConnection.

    In iOS 4 the workaround still seems to work, but only on the device, the Simulator does not invoke the allowsAnyHTTPSCertificateForHost: method anymore.

    0 讨论(0)
  • 2020-11-22 01:53

    I can't take any credit for this, but this one I found worked really well for my needs. shouldAllowSelfSignedCert is my BOOL variable. Just add to your NSURLConnection delegate and you should be rockin for a quick bypass on a per connection basis.

    - (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;
    }
    
    0 讨论(0)
提交回复
热议问题