iphone: secure restfull server "Сертификат для этого сервера недействителен.

Я пытаюсь использовать безопасный успокаивающий сервис, который выдает ошибку

Error = Error Domain = NSURLErrorDomain Code = -1202 «Сертификат для этого сервера недействителен. Возможно, вы подключаетесь к серверу, который выдает себя за« xxx.xxx.xxx.xxx », который может разместить вашу конфиденциальную информацию на риск ".

работает на xCode 4.2, где ошибка или какой-либо шаг отсутствует.

используя следующий код

RegisterUser.f

@interface RegisterUser : UIViewController<UITextFieldDelegate,
UIScrollViewDelegate, NSURLConnectionDelegate>

RegisterUser.m

- (IBAction)SubmitBtnAction:(id)sender {

    NSURL *url = [NSURL URLWithString:@"https://xx.xx.xx.xxx:8223/jaxrs/tunedoorgateway/getCountries"];
    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];

    [NSURLConnection sendAsynchronousRequest:urlRequest queue:[[NSOperationQueue alloc] init]
     completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
     {

         if ([data length] >0 && error == nil)
         {
             NSLog(@"Data = %@", data);
             // DO YOUR WORK HERE

         }
         else if ([data length] == 0 && error == nil)
         {
             NSLog(@"Nothing was downloaded.");
         }
         else if (error != nil){
             NSLog(@"Error = %@", error);
         }

     }];

}


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


- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
//    if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust])
//        if ([trustedHosts containsObject:challenge.protectionSpace.host])
            [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];

    [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
    NSLog(@"This is didReceiveAuthenticationChallenge");
  //  [[challenge sender] cancelAuthenticationChallenge:challenge];
}

person Azhar    schedule 10.09.2012    source источник
comment
Я бы решил эту проблему, установив правильную дату и время для своего устройства.   -  person Hemang    schedule 08.08.2013
comment
Решена та же проблема, просто устанавливая дату и время на устройствах автоматически.   -  person Tushar J.    schedule 25.07.2017


Ответы (3)


Я думаю, это может быть из-за DNS, что-то вроде того, что ваш сервер не зарегистрирован.

Попробуйте использовать это для разработки:

Создайте NSURLRequest+NSURLRequestSSLY.h файл и добавьте в него эти строки

#import <Foundation/Foundation.h>

@interface NSURLRequest (NSURLRequestSSLY)
+(BOOL)allowsAnyHTTPSCertificateForHost:(NSString*)host;

@end

Создайте NSURLRequest+NSURLRequestSSLY.m файл и добавьте в него эти строки

#import "NSURLRequest+NSURLRequestSSLY.h"

@implementation NSURLRequest (NSURLRequestSSLY)
+(BOOL)allowsAnyHTTPSCertificateForHost:(NSString*)host
{
    return YES;
}

@end

И не забудьте удалить его перед публикацией, так как ваше приложение может быть отклонено.

person Vaibhav Tekam    schedule 10.09.2012
comment
выдает ошибку #import NSURLRequest + NSURLRequestSSLY.h файл не найден? - person Azhar; 11.09.2012
comment
Просто поместите вокруг него #ifdef DEBUG и #endif, и проблема с выпуском в магазин приложений должна решиться сама собой;) - person Saren Inden; 07.03.2014
comment
@VaibhavTekam Что делать, если я хочу отправить приложение в магазин для производства и избавиться от этой проблемы? - person Jayprakash Dubey; 25.09.2014
comment
@Jayaprakash Dubey ... Получи сервер правильно. Проблем не должно быть вообще. - person Vaibhav Tekam; 29.09.2014

Ошибка не в вашем коде. Вы используете сервер HTTPS, который не предоставляет известный сертификат. Если вы настроили сервер самостоятельно, вам нужно пойти и купить подписанный сертификат в одном из крупных центров сертификации, которым доверяют iOS и большинство других операционных систем.

В целях разработки вы можете протестировать службу REST, игнорируя недоверенный сертификат. Для этого следуйте этому руководству: http://www.cocoanetics.com/2009/11/ignoring-certificate-errors-on-nsurlrequest/.

Но для производственного использования я рекомендую вам не использовать этот метод, поскольку он приведет к утечке безопасности в вашем приложении. Если вы игнорируете безопасность, вы также можете просто использовать HTTP вместо HTTPS.

person miho    schedule 10.09.2012
comment
Но здесь используется частный API, и Apply может отклонить приложение из-за этого, не могли бы вы помочь с каким-нибудь общедоступным API, например, тем, который я использовал, но у меня возникли проблемы с его решением - person Azhar; 11.09.2012
comment
ASIHttpRequest имеет простое свойство BOOL, которое отключает проверку сертификата. Возможно, вы посмотрите исходный код проекта или просто используете ASIHttpRequest вместо NSURLRequest. - person miho; 11.09.2012

Я пробовал несколько способов и выяснил, что это связано с сертификатом центра разработчиков Apple. Обновите свою подготовку и попробуйте еще раз. Я пробовал публиковать данные с iPad, iPhone 5 и 5S, но с iPhone 4. Когда я обновляю свою подготовку и устанавливаю на свой iPhone 4, работает с проблемой «сейчас».

person Pourang    schedule 27.08.2014