36

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=%@"
                               ,@"abc@example.com",@"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!!

devsri
  • 6,173
  • 5
  • 32
  • 40

8 Answers8

44

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.

Voda Ion
  • 3,426
  • 2
  • 16
  • 18
  • 1
    If you're nervous about turning off App Transport Security for all domains, you can do it for specific domains: https://studio76.pro/configuring-app-transport-security-exceptions-in-ios-9-and-osx-10-11/ – sirvine Jul 27 '15 at 03:08
  • 6
    For development purpose its ok, but when its go to app store submission this not acceptable. – damithH Sep 08 '16 at 09:11
15

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!!

devsri
  • 6,173
  • 5
  • 32
  • 40
9

Maybe your device has a wrong date & time :)

kolesnikovakate
  • 209
  • 1
  • 3
  • 5
4

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.

  • 1
    Great answer. I had the issue for Weibo integration and once I entered `TLSv1.0` it worked. Thanks. – jfgrang Oct 25 '16 at 16:26
0

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.

Ecyrb
  • 2,060
  • 3
  • 26
  • 44
0

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

gofr1
  • 15,741
  • 11
  • 42
  • 52
rui
  • 1
  • 4
-2

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.

Community
  • 1
  • 1
Ankita Shah
  • 2,178
  • 3
  • 25
  • 42
-5

Try the web address with safari from phone.