iPhone连接服务器时出现SSL错误

36

我正在尝试使用我的应用程序与服务器建立HTTPS连接。但由于以下错误,连接失败了:

Error Domain=NSURLErrorDomain Code=-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=%@"
                               ,@"abc@example.com",@"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];
   }

我卡在这里了,找不到任何解决方法。

非常感谢任何形式的帮助。

提前致谢!!

8个回答

44

iOS 9 强制使用 TLS 1.2 连接 HTTPS 来避免近期的漏洞。在 iOS 8 中即使未加密的 HTTP 连接也被支持,因此旧版本的 TLS 也没有任何问题。作为一种解决方法,您可以将以下代码片段添加到您的 Info.plist 文件中:

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

这样你就禁用了App Transport Security。希望这有所帮助。


1
如果您对关闭所有域的应用程序传输安全性感到紧张,您可以为特定域执行此操作:https://studio76.pro/configuring-app-transport-security-exceptions-in-ios-9-and-osx-10-11/ - sirvine
6
开发时可以,但提交应用商店时就不可接受了。 - damithH

15
自从很长时间以来一直没有回答,我的研究和当前的开发表明,该代码用于连接是完全正常的,问题在于服务器上的证书未经授权的 CA 签名。因此,任何遇到这种问题的人都应检查服务器端的证书是否有效。希望这可以帮到你!

1
不是CA的问题,只是因为SSL版本太低。 - DawnSong

9
也许您的设备日期和时间不正确 :)

太棒了。我检查了所有可能的解决方案,却忘记检查设备日期。感谢您提供这个提示。有时候我们会错过一些非常基本的东西,然后试图以复杂的方式进行调试。 - Bhanu Birani
1
你能详细说明为什么错误的日期会导致这个问题吗? - Glenn Howes
如果您的设备日期早于或晚于到期日期,则设备已过期。 - Popmedic

4

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

简而言之: 此原因在于从iOS9和OSX 10.11开始,所有使用XCode7构建的应用程序将需要TLS 1.2进行SSL连接,并且无法支持早期协议。
有几种方法可以解决这个问题。
“NSAppTransportSecurity -> NSAllowsArbitraryLoads”的方法不好,因为它会禁用您的应用程序所有连接的TLS 1.2,这可能导致您的应用程序被苹果拒绝。
“每个域名例外”方法更好。


1
非常好的答案。我在微博集成方面遇到了问题,一旦我输入了 TLSv1.0 就解决了。谢谢。 - jfgrang

0

我当时使用的是iOS 9.3.1版本,并且在使用https时遇到了这个问题。在模拟器上一切正常,但在我的iPad上却失败了。原因是因为我的iPad启用了WiFi,并连接到了公司的访客网络,但我没有收到弹出窗口来接受加入该网络的网站。在接受后,一切又恢复正常了。


0
请确保使用的TLS版本为1.2,而非TLS 1.0
XCode8上构建的应用程序将需要使用TLS 1.2进行SSL连接。

-2

我之前也遇到了同样的问题。

如果服务器上的SSL证书是私有证书,就会出现这个问题。在这种情况下,您可以使用this来解决它。


-5

请使用手机上的Safari浏览器尝试访问该网址。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接