Сертификат AFNetworking 2.0 не прочитан

Я использую код для чтения данных JSON:

[[DVAPIManager sharedManager] setUsername:user andPassword:pass];

NSLog(@"Using %d pinned certificates", [[DVAPIManager sharedManager].securityPolicy.pinnedCertificates count]);
[[DVAPIManager sharedManager] GET:@"/areas" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
            NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            NSLog(@"Error: %@", error);
}];

но NSLong, который у меня есть для отладки, дает: Использование 0 закрепленных сертификатов

я уже скопировал файл apache.cer в проект, а также в свой файл класса singleton:

- (id)initWithBaseURL:(NSURL *)url
{
    self = [super initWithBaseURL:url];
    if(!self)
        return nil;

    self.requestSerializer = [AFJSONRequestSerializer serializer];

    [[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES];
    AFSecurityPolicy *mySecurityPolicy = [[AFSecurityPolicy alloc] init];
    [mySecurityPolicy setSSLPinningMode:AFSSLPinningModeCertificate];


    [self  setSecurityPolicy:mySecurityPolicy];


    return self;
}

когда я запускаю, я получаю ошибку:

Ошибка: Error Domain=NSURLErrorDomain Code=-1012 "Операция не может быть завершена. (Ошибка NSURLErrorDomain -1012.)

Есть идеи, почему нельзя ПОЛУЧИТЬ данные JSON и почему система не может прочитать файл my.cer?

Когда я пытаюсь прочитать файл .cer вручную

[mySecurityPolicy setPinnedCertificates:[[NSArray alloc] initWithObjects:@"apache.cer", nil]];

он вылетает!!


person Charalampos    schedule 02.12.2013    source источник
comment
Пожалуйста, исправьте заголовок, форматирование и орфографию...   -  person DrummerB    schedule 03.12.2013


Ответы (2)


Я получил свой сертификат, загрузив его вручную:

- (void)setupSSL
{
    self.securityPolicy.SSLPinningMode = AFSSLPinningModePublicKey;
    NSString *sslPublicKeyPath = [[NSBundle mainBundle] pathForResource:@"mydomain" ofType:@"cer"];
    NSData *sslPublicKey = [NSData dataWithContentsOfFile:sslPublicKeyPath];
    [self.securityPolicy setPinnedCertificates:@[
        sslPublicKey
    ]];
}

Я сгенерировал свой ключ из своего pem со следующим:

openssl x509 -in mydomain.pem -out mydomain.cer -outform der
person drewag    schedule 18.02.2014

Я решил добавить этот код в свой одноэлементный класс, чтобы прочитать файл сертификата:

NSString* fileRoot = [[NSBundle mainBundle] pathForResource:@"apache" ofType:@"cer"];

NSData *certData = [[NSData alloc] initWithContentsOfFile:fileRoot];

self.requestSerializer = [AFJSONRequestSerializer serializer];

[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES];
AFSecurityPolicy *mySecurityPolicy = [[AFSecurityPolicy alloc] init];
[mySecurityPolicy setSSLPinningMode:AFSSLPinningModeCertificate];

[mySecurityPolicy setAllowInvalidCertificates:YES];
[mySecurityPolicy setPinnedCertificates:[[NSArray alloc] initWithObjects:certData, nil]];

вероятно, чтение файлов .cer по умолчанию не работает, вам нужно сделать это вручную (как в приведенном выше коде)

person Charalampos    schedule 03.12.2013
comment
К вашему сведению, эта реализация фактически вообще пропускает закрепление SSL, поскольку вы устанавливаете для параметра AllowInvalidCertificates значение YES. - person drewag; 18.02.2014
comment
@drewag У вас есть решение проблемы без пропуска закрепления SSL? - person Yaniv; 18.02.2014
comment
Да, я заставил его работать с моим собственным сертификатом, не прибегая к разрешению недействительных сертификатов. Я добавляю свое решение самого вопроса, но, короче говоря, я вручную загрузил сертификат и установил его в существующей политике безопасности (предварительно установив его в AFSSLPinningModePublicKey). - person drewag; 18.02.2014
comment
Это ничего не исправляет (для меня) - person Pierre de LESPINAY; 09.07.2014