Ответ 1
Чтобы разрешить неверный сертификат SSL с AFNetworking. Добавьте следующую строку в AFURLConnectionOperation.h ниже #import Availability.h
#define _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_ 1
Я хочу разрешить недопустимые SSL-сертификаты. Мой основной код ниже:
myClient = [[MyClient alloc] init];
[myClient getHtml:@"/path/to/the/distination.html"];
Ниже приведен код класса MyClient:
#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
Я прочитал ниже страницу и попробовал макрос, но это не работает.
Самоподписанный сертификат SSL · Проблема № 189 · AFNetworking/AFNetworking https://github.com/AFNetworking/AFNetworking/issues/189
Пожалуйста, помогите мне...
Чтобы разрешить неверный сертификат SSL с AFNetworking. Добавьте следующую строку в AFURLConnectionOperation.h ниже #import Availability.h
#define _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_ 1
В AFNetworking 2.0 вы можете использовать следующее:
[AFHTTPRequestOperationManager manager].securityPolicy.allowInvalidCertificates = YES;
Теперь вы можете использовать свойство allowInvalidSSLCertificate AFHTTPClient. Нет необходимости использовать определения в последних версиях AFNetworking.
AFHTTPClient* client = [AFHTTPClient clientWithBaseURL:@"url"];
client.allowsInvalidSSLCertificate = YES; //this defaults to no
Я использую RestKit, поэтому
client.allowsInvalidSSLCertificate = YES;
не работает. Опция не распространяется на операции, созданные restkit.
Я использую cocoapods, поэтому любые изменения в файле pch или проекте pods становятся более сложными. "Хак", который я использовал, - это операция пост-установки cocoapod, которая добавляет требуемое определение препроцессора. В конце моего файла я добавил:
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
Обратите внимание, что если вы устанавливаете через CocoaPods, #define
, то этот макрос в вашем проекте будет недостаточным - макрос компилятора должен быть установлен при компиляции статической библиотеки, чтобы он вступил в силу.
Здесь вы можете сделать это, используя диспетчер для операции 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 - быстрая версия:
var securityPolicy = AFSecurityPolicy()
securityPolicy.allowInvalidCertificates = true;
manager.securityPolicy = securityPolicy;
manager.POST(
"https://exmaple.com/foobar.php",
nil,
...
Вы должны подклассифицировать AFHttpClient и переопределить
- (AFHTTPRequestOperation *)HTTPRequestOperationWithRequest:(NSURLRequest *)request
success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure;
Это мой код.
- (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;
}
вы используете этот httpclient, и он может успешно получить доступ к самонастраиваемому веб-сайту.
Я расширил AFHTTPSessionManager в своем коде. При тестировании на тестовом сервере все, что мне нужно, это добавить одну строку следующим образом:
mySessionManager.securityPolicy.allowInvalidCertificates = YES;
AFHTTPRequestOperation * operation = [[AFHTTPRequestOperation alloc] initWithRequest: urlRequest]; operation.securityPolicy.allowInvalidCertificates = YES;
если вы используете RestKit, используя
client.allowsInvalidSSLCertificate = YES;
не будет работать, вместо этого сделайте следующее:
в вашем проекте, нажмите RestKit.xcodeproj, перейдите в проект > Настройки сборки > Макросы препроцессора
и добавьте _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_=1
thats finished.
Это - лучший способ для недопустимых сертификатов SSL с AFNetworking.
используйте _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_ для
project > Параметры сборки > Макросы препроцессора и добавьте их в Debug запись.
Надеюсь, что это поможет
если вы используете RestKit, используя
client.allowsInvalidSSLCertificate = YES;
не будет работать, вместо этого сделайте следующее:
если вы добавили комплект отдыха вручную в свой проект, нажмите RestKit.xcodeproj, перейдите в проект > Настройки сборки > Макросы препроцессора
и добавьте _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_=1
thats finished.
Я столкнулся с одной и той же проблемой, и ни одно из решений, которые я читаю, не работает.
Для меня единственным обходным решением является AFSecurityPolicy:
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
securityPolicy.allowInvalidCertificates = YES;
manager.securityPolicy = securityPolicy;
Я решил ответить, хотя вопрос старый, может быть, может помочь кому-то.