2011-02-18 207 views
27

我正尝试使用我的应用程序建立与服务器的HTTPS连接。但由于以下错误导致连接失败通过iPhone连接到服务器的SSL错误

错误域= NSURLErrorDomain代码= -1200“发生了SSL错误,并且无法建立与服务器的安全连接。 UserInfo = 0x612eb30 {NSErrorFailingURLStringKey = https:myURL.com/signup,NSLocalizedRecoverySuggestion =你想连接到服务器吗?,NSErrorFailingURLKey = https:myURL.com/signup,NSLocalizedDescription =发生了SSL错误,并且安全地连接到服务器无法进行,NSUnderlyingError = 0x612eb70“发生SSL错误和服务器的安全连接无法进行。”}

连接到服务器的代码是

-(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]; 
    } 
} 

我的委托方法有

- (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]; 
    } 

我被困在这里,找不到任何出路。

任何形式的帮助将不胜感激。

在此先感谢!

回答

13

由于长时间没有答案,而且我的研究和当前的发展表明代码对于连接来说非常好,所以它在服务器上的证书并没有被授权的CA签名。所以任何有此类问题的人都会检查证书在服务器端是否有效。

希望这会有所帮助!

+1

你如何解决这个地方发展? – 2015-10-05 05:39:12

+0

不是CA的问题,只是因为SSL的版本太低。 – 2016-12-08 10:02:58

-4

用手机通过safari试试网址。

-1

你可以使用这个。

[NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:str]; 

这将允许ssl层接受证书,即使证书中的主题不等于主机。

这是老办法的iOS 5至7

希望这有助于!

+4

我建议不要这样做。有关Apple的警告,请参阅https://developer.apple.com/library/ios/technotes/tn2232/_index.html。这不是一个公共API。 – 2015-09-16 17:18:58

41

iOS 9将使用HTTPS的连接强制为TLS 1.2以避免最近的漏洞。在iOS 8中,即使未加密的HTTP连接也受到支持,因此老版本的TLS也没有任何问题。作为一种变通方法,您可以将此代码段添加到您的Info.plist:

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

因此你禁用应用程序传输安全。希望这有帮助。

+1

如果您对关闭所有域的App Transport Security感到紧张,可以为特定域执行此操作:https://studio76.pro/configuring-app-transport-security-exceptions-in-ios-9-and- osx-10-11/ – sirvine 2015-07-27 03:08:17

4

看看这个页面: https://github.com/vinhnx/iOS-issues/issues/1

一言以蔽之: 的原因是,从iOS9和OSX 10.11开始建立在XCode7所有的应用程序都需要TLS 1.2 SSL连接,并未能更早协议。
有几种方法可以解决这个问题。
“NSAppTransportSecurity - > NSAllowsArbitraryLoads”方法不好,因为它会禁用TLS 1。2用于来自您应用的所有连接,这可能会导致Apple拒绝您的应用。
“每域例外”方法要好得多。

0

我使用的是iOS 9.3.1,并使用HTTPS时,我打了这个问题。它通过模拟器正常工作,但在我的iPad上失败。原因是因为我的iPad启用了WiFi并已连接到我公司的访客网络,但我没有收到我接受加入网络的弹出式网站。接受一切后再次正常工作。

-2

即使我面临同样的问题。

如果服务器上的SSL证书是专用证书,则可能会发生此问题。在这种情况下,您可以使用this来解决此问题。

0

请确保TLS的版本是1.2 ,不TLS 1.0

应用程序建立在XCode8需要TLS 1.2用于SSL连接