2013-02-15 12 views
7

Mam instalację AFNetworking, ale nie akceptuję adresów URL https. Jak mogę uzyskać AFNEtworking do połączenia przez ssl.Jak mogę zezwolić na połączenie https za pomocą AFNetworking?

Mam następujący kod:

NSMutableURLRequest *apiRequest = 
[self multipartFormRequestWithMethod:@"POST" 
           path: pathstr 
          parameters: params 
      constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) 
      { 
       //TODO: attach file if needed 
      }]; 



AFJSONRequestOperation* operation = [[AFJSONRequestOperation alloc] initWithRequest: apiRequest]; 
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
    //success! 
    completionBlock(responseObject); 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    //failure :(

    NSLog(@"%@", error); 
    completionBlock([NSDictionary dictionaryWithObject:[error localizedDescription] forKey:@"error"]); 
}]; 

[operation start]; 
+1

Co jest błąd w dzienniku? Czy twój certyfikat serwera jest ważny? – nioq

Odpowiedz

6

To oczywiście tylko działać, jeśli masz non samopodpisany cert albo dodać:

#define _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_ do pliku PCH. Jeśli używasz strąki kakao do tego będzie prawdopodobnie trzeba podklasy AFHTTPRequestOperation i wdrożenie:

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace 
{ 
    if ([[protectionSpace authenticationMethod] isEqualToString:NSURLAuthenticationMethodServerTrust]) { 

     if ([self bypassSslCertValidation:protectionSpace]) 
      return YES; 
     else 
      return [super connection:connection canAuthenticateAgainstProtectionSpace:protectionSpace]; 

    } 
    return [super connection:connection canAuthenticateAgainstProtectionSpace:protectionSpace]; 

} 

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 
{ 
    if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { 
     if ([self bypassSslCertValidation:challenge.protectionSpace]) { 
      [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge]; 
      return; 
     } 
     else 
      return [super connection:connection didReceiveAuthenticationChallenge:challenge]; 
     return; 
    } 
} 

- (BOOL) bypassSslCertValidation:(NSURLProtectionSpace *) protectionSpace 
{ 
    if (ENVIRONMENT_TYPE == DEV_ENV || ENVIRONMENT_TYPE == STAGING_ENV) { 
     return YES; 
    } 
    return NO; 
} 

Wtedy powiedzieć AFNEtworking korzystać z nowej podklasy:

AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@""]]; 
[client registerHTTPOperationClass:[YourSubClassHTTPRequestOperation class]]; 

To nie jest najłatwiejszą rzeczą do zrobienia w świat i techniczne ignorowanie samopodpisania nie działa, ale jeśli używasz standardowych certyfikatów SLL Prawdopodobnie zadziała to dobrze, pamiętaj o usunięciu tego kodu lub udostępnieniu go tylko podczas debugowania, jeśli planujesz zwolnić.

Dodając do odpowiedzi, ponieważ komentarze mają ograniczenia znaków!

kilka wyborów patrząc na działania headers

powrotne, które mogą być ręcznie dodane do kolejki:

- (AFHTTPRequestOperation *)HTTPRequestOperationWithRequest:(NSURLRequest *)urlRequest 

lub przekazać w swojej pracy niestandardowej podklasy do tego:

- (void)enqueueHTTPRequestOperation:(AFHTTPRequestOperation *)operation; 
+1

Czy jest to łatwiejszy sposób? – Jasmine

+0

Niestety nie, że znalazłem, dosłownie po prostu zaimplementowałem to wczoraj dla mojego lokalnego rozwoju SSL, możesz nawet posunąć się tak daleko, aby powiedzieć to, z czego hosta zignorować SSL. Słyszałem gdzieś, że dodali SSL Pinning, trafiłem w Google. – Holyprin

+0

Gdzie mogę powiedzieć, że AfNetworking implementuje podklasę AFHTTPClient? Jak mogę zmienić moje codeabove, aby to zrobić ... Dzięki! – Jasmine

2

Wypróbuj ten kod.

NSMutableURLRequest *apiRequest = 
[self multipartFormRequestWithMethod:@"POST" 
           path: pathstr 
          parameters: params 
      constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) 
      { 
       //TODO: attach file if needed 
      }]; 



AFJSONRequestOperation* operation = [[AFJSONRequestOperation alloc] initWithRequest: apiRequest]; 
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
    //success! 
    completionBlock(responseObject); 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    //failure :(

    NSLog(@"%@", error); 
    completionBlock([NSDictionary dictionaryWithObject:[error localizedDescription] forKey:@"error"]); 
}]; 
operation.securityPolicy.allowInvalidCertificates = YES; 
[operation start]; 
+0

Umożliwi to korzystanie z połączenia https, ale nie będzie bezpiecznym połączeniem. Oznacza to, że musisz skonfigurować program SecurityPolicy za pomocą certyfikatów * .cer z usługi sieci Web, aby uzyskać bezpieczne połączenie. –

14
operation.securityPolicy.allowInvalidCertificates = YES; 

Kod ten jest bardzo ważny. Jeśli tego nie zrobisz, otrzymasz błąd.

+0

To jest idealne i bardziej czyste. – Jirapong

0

Jeśli AFNetworking jest wyłączona podklasa nad nadklasy realizacji po prostu umieścić w kodzie jak: http // // foo bar i ustawić to bool

Powiązane problemy