2014-01-17 3 views
9

Я знаю, что если я использую следующую nsurlconnectiondelegate это будет исправленоСертификат для этого сервера недействителен

– connection:willSendRequestForAuthenticationChallenge: – connection:canAuthenticateAgainstProtectionSpace

Но я пытаюсь использовать

sendAsynchronousRequest:queue:completionHandler:

Таким образом, вы не получите обратный вызов , Я посмотрел на яблочные документы, которые он скажет после

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

Я не мог понять, как это сделать. Когда я посмотрел все, что я получил, это частный звонок

+(void)setAllowsAnyHTTPSCertificate:(BOOL)inAllow forHost:(NSString *)inHost;

Любая идея, как это сделать?

Ниже ошибка я получаю

The certificate for this server is invalid. You might be connecting to a server that is pretending to be “example.com=0x8b34da0 {NSErrorFailingURLStringKey= https://example.com/test/ , NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, NSErrorFailingURLKey= https://example.com/test/ , NSLocalizedDescription=The certificate for this server is invalid. You might be connecting to a server that is pretending to be “example.com” which could put your confidential information at risk., NSUnderlyingError=0xa26c1c0 "The certificate for this server is invalid. You might be connecting to a server that is pretending to be “example.com” which could put your confidential information at risk.", NSURLErrorFailingURLPeerTrustErrorKey=

ответ

3

вы не можете исправить это с тем, как вы пытаетесь

  • либо падение в CFNetworking, чтобы дурные CERTS
  • использовать соединение NSConnection с делегатом и undoc'd метода
  • использовать частный API вы нашли

все не хорошо. CFNetwork должен быть хорошо для яблока сейчас, но другие 2 метода даже не AppStore безопасной

Лучше получить сервер фиксированы. То самый простой и чистейших

+0

Оказывается, что вызов был перенаправлен на сервер, вызвав эту проблему. Исправлено, указывая непосредственно на сервер. – pa12

+0

@ Daij-Djan Если используется частный API, приложение будет отклонено при подаче в App Store в случае, если приложение предназначено для производства. –

+0

Да, что написано мной, я написал «CFNetwork теперь должен быть в порядке для яблока, но другие 2 метода даже не безопасны для аптек» –

0

То есть ошибка сертификата. вам необходимо изменить настройки, чтобы ваша программа/os игнорировала сертификат или добавляла URL-адрес в доверенный список.

К сожалению, это аутентификация, сертификат является аутентификацией. Я посмотрел, и я нашел эту статью.

Не уверен, что он разрешит вашу проблему, но в основном говорится, что они не охватывают случай подключения к сайту с каким сертификатом в документации.

http://www.cocoanetics.com/2009/11/ignoring-certificate-errors-on-nsurlrequest/

+0

Вы правы. Виноват. Можете ли вы объяснить, как это сделать? – pa12

+0

-1 плохой совет вы не можете сделать так: quote: «Я получил сообщение о том, что кто-то получил свое приложение, отклоненное для использования этого метода, поэтому вы действительно можете использовать его только для тестирования». –

3

Если вы используете AFNetworking, вы можете использовать этот код: (! Так же, как температура на стороне клиента решение)

AFHTTPSessionManager * apiManager = [AFHTTPSessionManager initWithBaseURL:[NSURL URLWithString:baseURL]; 
AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone]; 
policy.allowInvalidCertificates = YES; 
apiManager.securityPolicy = policy; 
+1

Что делать, если AFNetworking не используется? –

+1

@JayprakashDubey хорошо, тогда посмотрите на принятый ответ – skywinder

8

Веб-сервер, который вы используя запрос на проверку подлинности сервера, вам необходимо надлежащим образом ответить соответствующим действием. Вам необходимо реализовать метод делегатов connection:willSendRequestForAuthenticationChallenge: и использовать SecTrustRef для его аутентификации.

Более подробную информацию можно найти здесь: - https://developer.apple.com/library/ios/technotes/tn2232/_index.html

Это был мой код, чтобы исправить ошибку:

- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 
{ 
    NSURLProtectionSpace *protectionSpace = [challenge protectionSpace]; 

    id<NSURLAuthenticationChallengeSender> sender = [challenge sender]; 

    if ([[protectionSpace authenticationMethod] isEqualToString:NSURLAuthenticationMethodServerTrust]) 
    { 
     SecTrustRef trust = [[challenge protectionSpace] serverTrust]; 

     NSURLCredential *credential = [[NSURLCredential alloc] initWithTrust:trust]; 

      [sender useCredential:credential forAuthenticationChallenge:challenge]; 
    } 
    else 
    { 
     [sender performDefaultHandlingForAuthenticationChallenge:challenge]; 
    } 
} 
+0

Удивительный, спасибо большое. –

+0

Лучшее решение, спасибо человеку :) –

1

Эта проблема не может быть решена с тем, как вы пытаетесь с блоками. вам необходимо установить делегаты и выполнить делегаты проверки подлинности, чтобы обойти проверку сертификата. Лучшим решением является либо создание правильного сертификата (убедитесь, что он не подписан сам по себе), либо изменить протокол на HTTP, если с ним все в порядке.

0

В моем случае, эта ошибка произошла из-за мой брандмауэр заблокировал нужный URL. он отлично работает после устранения ограничений брандмауэра

 Смежные вопросы

  • Нет связанных вопросов^_^