35
votes

I am trying to establish a HTTPS connection to a server using my app. But the connection fails due to following error

Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." UserInfo=0x612eb30 {NSErrorFailingURLStringKey=https:myURL.com/signup, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, NSErrorFailingURLKey=https:myURL.com/signup, NSLocalizedDescription=An SSL error has occurred and a secure connection to the server cannot be made., NSUnderlyingError=0x612eb70 "An SSL error has occurred and a secure connection to the server cannot be made."}

The code to connect to server is

-(IBAction) handleEvents:(id)sender
 {
    if ((UIButton*)sender == submit) {

    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;


    NSLog(@"Begin");
    NSData *urlData;
    NSURLResponse *response;
    NSError *error;

    NSString *url =[[NSString alloc]initWithFormat:@"%@signup",baseURL];
    NSURL *theURL =[NSURL URLWithString:url];
    NSMutableURLRequest *theRequest =[NSMutableURLRequest requestWithURL:theURL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:0.0f];
    [theRequest setHTTPMethod:@"POST"];
    NSString *theBodyString = [NSString stringWithFormat:@"emailId=%@&mobileNumber=%@&appId=%@&password=%@&firstName=%@&lastName=%@"
                               ,@"[email protected]",@"919879876780",@"bf1c7a6b3d266a7fe350fcfc4dda275211c13c23" ,@"qwerty" , @"Dev" , @"Sri"];
    NSData *theBodyData = [theBodyString dataUsingEncoding:NSUTF8StringEncoding];

    [theRequest setHTTPBody:theBodyData];
    urlData = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:&response error:&error];
    }
}

my delegate methods are

- (void)handleError:(NSError *)error
{
NSLog(@"----->%@",error);
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
  [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;   

 }

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

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge (NSURLAuthenticationChallenge *)challenge {  
    NSLog(@"check auth");
    [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
   }

I am stuck over here and could not find any way out.

Any form of help would be greatly appreciated.

thanks in advance!!

8

8 Answers

44
votes

iOS 9 forces connections that are using HTTPS to be TLS 1.2 to avoid recent vulnerabilities. In iOS 8 even unencrypted HTTP connections were supported, so that older versions of TLS didn't make any problems either. As a workaround, you can add this code snippet to your Info.plist:

  <key>NSAppTransportSecurity</key>  
  <dict>  
  <key>NSAllowsArbitraryLoads</key>  
  <true/>  
  </dict>  

Thereby you're disabling the App Transport Security. Hope that's helpful.

15
votes

Since it has been left unanswered for long time and my research and current development indicates that the code is perfectly fine for the connection, its the certificate at the server that was not signed by an authorized CA. so anyone having such kind of problem check that the certificate is valid at server end or not.

Hope this would help!!

8
votes

Maybe your device has a wrong date & time :)

4
votes

Take a look at this page: https://github.com/vinhnx/iOS-issues/issues/1

In a nutshell: The reason is, that starting from iOS9 and OSX 10.11 all apps built on XCode7 will require TLS 1.2 for SSL connection, and fails for earlier protocols.
There are several methods to overcome this issue.
"NSAppTransportSecurity -> NSAllowsArbitraryLoads" approach is not good, because it will disable TLS 1.2 for all connections from your app, and this can lead to rejection of your app by Apple.
"Per-Domain Exceptions" approach is much more better.

0
votes

I was using iOS 9.3.1 and was using https when I hit this problem. It worked fine through the simulator, but failed on my iPad. The reason is because my iPad had WiFi enabled and had connected to my company's guest network, but I hadn't received the pop-up website where I accept to join the network. After accepting everything worked fine again.

0
votes

Please, make sure the version of TLS is 1.2,not TLS 1.0.

Apps built on XCode8 will require TLS 1.2 for SSL connection

-2
votes

Even I was facing the same issue.

This issue can be occur if the SSL certificate over server is a private certificate. In such scenario you can solve it using this.

-4
votes

Try the web address with safari from phone.