2012-10-19 16 views
26

Desidero consentire i certificati SSL non validi. Il mio codice principale è qui sotto:Desidero consentire i certificati SSL non validi con AFNetworking

myClient = [[MyClient alloc] init]; 
[myClient getHtml:@"/path/to/the/distination.html"]; 

Il MyClient codice della classe è qui sotto:

#import <Foundation/Foundation.h> 
#import "AFNetworking.h" 

@interface MyClient : NSObject 

- (void)getHtml:(NSString *)path; 

@end 

#define _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_ 

@implementation MyClient 

- (void)getHtml:(NSString *)path 
{ 
    AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"https://trusted.server.net"]]; 
    [httpClient getPath:path parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { 
     NSLog(@"%@", responseObject); 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"error = %@", error); 
    }]; 
} 

@end 

ho letto di sotto della pagina e provato la macro, ma questo non funziona.

autofirmato certificato SSL · Issue # 189 · AFNetworking/AFNetworkinghttps://github.com/AFNetworking/AFNetworking/issues/189

Please help me ...

risposta

40

Per consentire il certificato SSL non valido con AFNetworking. Aggiungere la seguente riga nel AFURLConnectionOperation.h sotto #import Availability.h

#define _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_ 1 
+13

A partire dalla versione 1.2.1, non è più necessario impostare questa definizione. Invece è possibile impostare la proprietà 'allowInvalidSSLCertificate' su YES su AFHTTPRequestOperation, che è molto più conveniente. – Phil

+0

Se lo fai, assicurati di farlo solo in modalità di debug. Se si stanno colpendo gli endpoint HTTPS e si abilitano i certificati non validi, si perde una buona parte della sicurezza che si ottiene da SSL. –

+6

C'è un modo per ottenere allowInvalidSSLCertificate per funzionare con UIImageView + AFNetworking? –

8

Si noti che se si sta installando attraverso CocoaPods, #define -ing questa macro nel progetto non sarà sufficiente - la macro del compilatore deve essere impostata durante la compilazione della libreria statica affinché abbia effetto.

+2

"la macro compilatore deve essere impostata quando si compila la libreria statica in modo che esso abbia effetto" - Come si fa a farlo ? –

4

Si dovrebbe sottoclasse l'AFHttpClient, e sovrascrivere

- (AFHTTPRequestOperation *)HTTPRequestOperationWithRequest:(NSURLRequest *)request 
               success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success 
               failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; 

Questo è il mio codice.

- (AFHTTPRequestOperation *)HTTPRequestOperationWithRequest:(NSURLRequest *)urlRequest success:(void (^)(AFHTTPRequestOperation *, id))success failure:(void (^)(AFHTTPRequestOperation *, NSError *))failure 
{ 
    AFHTTPRequestOperation *operation = [super HTTPRequestOperationWithRequest:urlRequest success:success failure:failure]; 

    [operation setAuthenticationAgainstProtectionSpaceBlock:^BOOL(NSURLConnection *connection, NSURLProtectionSpace *protectionSpace) { 
     return YES; 
    }]; 
    [operation setAuthenticationChallengeBlock:^(NSURLConnection *connection, NSURLAuthenticationChallenge *challenge) { 
     if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { 
      [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge]; 
     } 
    }]; 
    return operation; 
} 

si utilizza questo httpclient e può accedere correttamente al Web senza firma.

+0

Perché hai bisogno di sottoclasse per questo? Sembra che tu possa semplicemente aggiungere lo spazio di protezione e i blocchi di autenticazione di sfida da qualsiasi luogo o manco qualcosa? –

+0

Se si desidera consentire i certificati autofirmati a livello di codice e utilizzare comunque AFHTTPClient, è necessario farlo in questo modo. Sfortunatamente non esiste un equivalente 'setAuthenticationAgainstProtectionSpaceBlock' per AFHTTPClient. – bobics

24

È ora possibile utilizzare la proprietà allowsInvalidSSLCertificate del AFHTTPClient. Non è necessario utilizzare definisce nelle ultime versioni di AFNetworking.

AFHTTPClient* client = [AFHTTPClient clientWithBaseURL:@"url"]; 
client.allowsInvalidSSLCertificate = YES; //this defaults to no 
+0

non funziona con la versione di rete AF precedente 2.0 – NAlexN

1

This è il metodo migliore per allowign certificati SSL non validi con AFNetworking.

use add a _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_ to

project > Build Settings > Preprocessor Macros and add it to Debug entry.

speriamo vi sia utile

12

Sto usando RestKit così

client.allowsInvalidSSLCertificate = YES; 

non funziona. L'opzione non viene propagata alle operazioni create dal restkit.

Sto utilizzando i cocoapod in modo che eventuali modifiche nel file pch o nel progetto dei pod vengano annullate. Il "trucco" che ho usato è un'operazione di post-installazione di cocoapod che aggiunge la definizione del preprocessore richiesta. Alla fine del mio file pod ho aggiunto:

post_install do |installer_representation| 
    installer_representation.project.targets.each do |target| 
    if target.name == 'Pods-AFNetworking' 
     target.build_configurations.each do |config| 
     config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)'] 
     config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] << '_AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_=1' 
     end 
    end 
    end 
end 
+1

Su iOS7 e XCode 5 questo ha fatto il trucco per me. Sto usando AFNetworking 1.3.3 – Humber

+0

OMG! Grazie mille! –

+0

Anche questo mi ha aiutato. Roba buona. – bleeckerj

44

In AFNetworking 2.0, è possibile utilizzare il seguente:

[AFHTTPRequestOperationManager manager].securityPolicy.allowInvalidCertificates = YES; 
+0

Ciò aiuta. Ho aggiunto "self.securityPolicy.allowInvalidCertificates = YES;" nel metodo init di AFHTTPRequestOperationManager. –

1

se si utilizza RestKit utilizzando

client.allowsInvalidSSLCertificate = YES; 

non funziona, invece fare questo:

se hai aggiunto kit di riposo manualmente al progetto , cliccare su RestKit.xcodeproj Vai al progetto> Crea Impostazioni> preprocessore macro

e aggiungere _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_=1

questo è finito.

+1

attualmente objectManager.HTTPClient.allowsInvalidSSLCertificate = YES; o qualcosa di simile in RestKit funziona –

2

se si utilizza RestKit utilizzando

client.allowsInvalidSSLCertificate = YES; 

non funziona, invece fare questo:

nel progetto, cliccare su RestKit.xcodeproj Vai al progetto> Costruire Impostazioni> preprocessore macro

e aggiungi _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_=1

questo è finito.

5

Ecco come è possibile farlo utilizzando il gestore per un'operazione POST.

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; //initialize 
manager.securityPolicy.allowInvalidCertificates=YES; //allow unsigned 
manager.responseSerializer=[AFJSONResponseSerializer serializer]; //set up for JSOn 
[manager POST:@"myweb.com" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { 
    //success stuff 
}failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    //error stuff 
}]; 

EDIT - versione rapida:

var securityPolicy = AFSecurityPolicy() 
    securityPolicy.allowInvalidCertificates = true; 
    manager.securityPolicy = securityPolicy; 
    manager.POST(
     "https://exmaple.com/foobar.php", 
     nil, 
    ... 
3

AFHTTPRequestOperation * Funzionamento = [[AFHTTPRequestOperation alloc] initWithRequest: urlRequest]; operation.securityPolicy.allowInvalidCertificates = YES;

0

Ho riscontrato lo stesso problema e nessuna delle soluzioni che ho letto funziona.

Per me l'unica soluzione è impostare il AFSecurityPolicy come questo:

AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone]; 
securityPolicy.allowInvalidCertificates = YES; 
manager.securityPolicy = securityPolicy; 

ho deciso di rispondere anche se la questione è vecchio, forse può aiutare qualcuno.

4

Ho esteso AFHTTPSessionManager nel mio codice. Durante il test contro un server di prova, tutto quello che serve è l'aggiunta di una sola riga come questa:

mySessionManager.securityPolicy.allowInvalidCertificates = YES; 
Problemi correlati