Je souhaite autoriser des certificats SSL non valides . Mon code principal est ci-dessous:
myClient = [[MyClient alloc] init];
[myClient getHtml:@"/path/to/the/distination.html"];
Le code de classe MyClient est ci-dessous:
#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
J'ai lu la page ci-dessous et essayé la macro mais cela ne fonctionne pas.
Certificat auto-signé SSL · Numéro 189 · AFNetworking/AFNetworkinghttps://github.com/AFNetworking/AFNetworking/issues/189
Aidez-moi, s'il vous plaît...
Pour autoriser un certificat SSL non valide avec AFNetworking. Ajoutez la ligne suivante dans AFURLConnectionOperation.h sous #import Availability.h
#define _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_ 1
Dans AFNetworking 2.0, vous pouvez utiliser les éléments suivants:
[AFHTTPRequestOperationManager manager].securityPolicy.allowInvalidCertificates = YES;
Vous pouvez maintenant utiliser la propriété allowInvalidSSLCertificate de AFHTTPClient. Pas besoin d'utiliser définit dans les dernières versions de AFNetworking.
AFHTTPClient* client = [AFHTTPClient clientWithBaseURL:@"url"];
client.allowsInvalidSSLCertificate = YES; //this defaults to no
J'utilise RestKit donc
client.allowsInvalidSSLCertificate = YES;
ne marche pas. L'option n'est pas propagée aux opérations créées par restkit.
J'utilise des cocoapodes afin que toute modification apportée au fichier pch ou au projet de modules soit annulée. Le hack que j’ai utilisé est une opération post-installation de cocoapod qui ajoute la définition requise du préprocesseur. A la fin de mon fichier pod j'ai ajouté:
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
Notez que si vous installez avec CocoaPods, #define
- cette macro dans votre projet ne suffira pas - la macro du compilateur doit être définie lors de la compilation de la bibliothèque statique pour que celle-ci soit effective.
Voici comment procéder à l'aide du gestionnaire pour une opération 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 - version Swift:
var securityPolicy = AFSecurityPolicy()
securityPolicy.allowInvalidCertificates = true;
manager.securityPolicy = securityPolicy;
manager.POST(
"https://exmaple.com/foobar.php",
nil,
...
Vous devez sous-classer AFHttpClient et remplacer
- (AFHTTPRequestOperation *)HTTPRequestOperationWithRequest:(NSURLRequest *)request
success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure;
Ceci est mon code.
- (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;
}
vous utilisez ce httpclient et il peut accéder avec succès au Web auto-signé.
J'ai étendu AFHTTPSessionManager dans mon code. Lors des tests sur un serveur de test, tout ce dont j'ai besoin est d'ajouter une seule ligne, comme ceci:
mySessionManager.securityPolicy.allowInvalidCertificates = YES;
AFHTTPRequestOperation * operation = [[AFHTTPRequestOperation alloc] initWithRequest: urlRequest]; operation.securityPolicy.allowInvalidCertificates = YES;
si vous utilisez RestKit en utilisant
client.allowsInvalidSSLCertificate = YES;
ne fonctionnera pas, faites plutôt ceci:
dans votre projet, cliquez sur RestKit.xcodeproj, sélectionnez Projet> Paramètres de construction> Macros de préprocesseur
et ajoutez _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_=1
c'est fini.
si vous utilisez RestKit en utilisant
client.allowsInvalidSSLCertificate = YES;
ne fonctionnera pas, faites plutôt ceci:
si vous avez ajouté manuellement Rest Kit à votre projet, cliquez sur RestKit.xcodeproj, sélectionnez Projet> Paramètres de construction> Macros de préprocesseur.
et ajoutez _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_=1
c'est fini.
Ceci est la meilleure méthode pour autoriser des certificats SSL non valides avec AFNetworking.
utilisez add a _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_ pour
projet> Paramètres de construction> Macros de préprocesseur et ajoutez-le à Debug entrée.
J'espère que ça aide
J'ai rencontré le même problème et aucune des solutions que j'ai lues ne fonctionne.
Pour moi, la seule solution consiste à définir la AFSecurityPolicy comme ceci:
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
securityPolicy.allowInvalidCertificates = YES;
manager.securityPolicy = securityPolicy;
J'ai décidé de répondre alors que la question est ancienne, peut-être aider quelqu'un.