Я пытаюсь добавить закрепление SSL в свое приложение с самозаверяющим сертификатом, но не могу заставить его работать. Я пробовал все, что мог найти в Интернете, но безуспешно, и отсутствие эксперта в том, как работает SSL, не помогает.
Я использую Objective-C с последней версией AFNetworking.
Я сделал очень простой фрагмент кода для проверки своих вызовов API (я использую URL-адрес заполнителя для этого поста):
NSString *url = @"https://api.example.net/webservice";
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"example.net" ofType:@"der"];
NSData *certData = [NSData dataWithContentsOfFile:cerPath];
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:url]];
manager.requestSerializer = [AFJSONRequestSerializer new];
manager.responseSerializer = [AFJSONResponseSerializer new];
AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
[policy setAllowInvalidCertificates:YES];
[policy setValidatesDomainName:NO];
policy.pinnedCertificates = [NSSet setWithObject:certData];
manager.securityPolicy = policy;
[manager POST:url parameters:nil headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"SUCCESS");
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"FAILURE : %@", error.localizedDescription);
}];
Каждый раз, когда я пытаюсь выполнить этот код, я получаю ошибку со следующей ошибкой:
Error Domain=NSURLErrorDomain Code=-1202 "The certificate for this server is invalid. You might be connecting to a server that is pretending to be “api.example.net” which could put your confidential information at risk."
Я пытался использовать разные форматы для своего сертификата (.der, .cer, ...), но все равно всегда получаю ту же ошибку.
Я пытался использовать NSAllowsArbitraryLoads
в своем info.plist, но ничего не изменилось.
Чтобы убедиться, что я использую рабочий код, я также загрузил пример проекта из учебник Рэя Вендерлиха, но мой собственный сертификат по-прежнему недействителен (в учебнике используется сертификат stackexchange, этот работает).
Я исследовал эту проблему в течение нескольких дней и еще не нашел решения.
Этот же сертификат отлично работает в нашем приложении для Android, а также в Postman.
Это потому, что я использую самозаверяющий сертификат, а iOS это не нравится? Есть ли что-то очевидное, что я пропустил в своем коде или в конфигурации моего приложения? Есть ли что-то конкретное для реализации на стороне сервера, чтобы убедиться, что оно работает с iOS? Должен ли я экспортировать свой сертификат в особом формате?
Любая информация приветствуется.
Спасибо!