2011-02-18 204 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連接