На конференции разработчиков WWDC 2016 компания Apple объявила о последнем сроке: к 1 января 2017 года все приложения в App Store должны были включить функцию безопасности App Transport Security (ATS). ATS — это функция конфиденциальности, представленная Apple в iOS 9, которая блокирует незащищённые HTTP-запросы и требует использования более безопасного протокола HTTPS. В настоящее время Apple позволяет разработчикам временно отключить ATS, но к концу года все официальные магазины приложений должны будут использовать ATS в обязательном порядке.
В проекте используется фреймворк AFNetworking версии 3.0 или выше. Из-за ATS iOS разрешает только ссылки, начинающиеся с Https. До 30 декабря 2016 года Apple разрешала обходить ATS.
Однако с 1 января 2017 года больше не будут приниматься приложения, использующие HTTP для загрузки ресурсов. Поэтому эта статья посвящена тому, как использовать AFN для аутентификации через самозаверяющий сертификат (примечание: для сертификатов, сертифицированных CA, аутентификация не требуется, можно напрямую использовать ссылки, начинающиеся с Https, для доступа к данным и загрузки страниц).
#import <Foundation/Foundation.h>
typedef void (^HttpSuccess)(id json);
typedef void (^HttpErro)(NSError* error);
@interface AKNetPackegeAFN : NSObject
+(instancetype)shareHttpManager;
- (void)netWorkType:(AKNetWorkType)netWorkType Signature:(NSString *)signature API:(NSString *)api Parameters:(NSDictionary *)parameters Success:(HttpSuccess)sucess Fail:(HttpErro)fail;
@end
#import "AKNetPackegeAFN.h"
#import "AFNetworking.h"
@interface AKNetPackegeAFN()
@property (nonatomic,strong) AFHTTPSessionManager *manager;
@end
@implementation AKNetPackegeAFN
+(instancetype)shareHttpManager{
static dispatch_once_t onece = 0;
static AKNetPackegeAFN *httpManager = nil;
dispatch_once(&onece, ^(void){
httpManager = [[self alloc]init];
});
return httpManager;
}
Для использования необходимо преобразовать полученный от бэкенда сертификат в формат .cer и добавить его в корневой каталог проекта. Затем в методе можно выполнить привязку, например, если имя полученного сертификата — Kuture.crt, то после двойного щелчка для установки сертификата, откройте цепочку ключей и экспортируйте сертификат с именем Kuture в формате .cer.
- (void)netWorkType:(AKNetWorkType)netWorkType Signature:(NSString *)signature API:(NSString *)api Parameters:(NSDictionary *)parameters Success:(HttpSuccess)sucess Fail:(HttpErro)fail{
// Включить режим проверки сертификата
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
// Разрешить использование самозаверяющих сертификатов
signature == nil ? (void)(securityPolicy.allowInvalidCertificates = NO):(securityPolicy.allowInvalidCertificates = YES);
// Не проверять доменное имя
securityPolicy.validatesDomainName = NO;
_manager = [[AFHTTPSessionManager alloc]initWithBaseURL:[NSURL URLWithString:api]];
_manager.responseSerializer = [AFJSONResponseSerializer serializer];
_manager.securityPolicy = securityPolicy;
_manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"application/xml",@"text/xml",@"text/json",@"text/plain",@"text/javascript",@"text/html", nil];
if (signature != nil){
__weak typeof(self) weakSelf = self;
[_manager setSessionDidReceiveAuthenticationChallengeBlock:^NSURLSessionAuthChallengeDisposition(NSURLSession *session, NSURLAuthenticationChallenge *challenge, NSURLCredential *__autoreleasing *_credential) {
// Получить объект доверия сервера
SecTrustRef serverTrust = [[challenge protectionSpace] serverTrust];
// Импортировать самозаверяющий сертификат
NSString *cerPath = [[NSBundle mainBundle] pathForResource:signature ofType:@"cer"];
NSData *cerData = [NSData dataWithContentsOfFile:cerPath];
if (!cerData) {
NSLog(@"==== .cer file is nil ====");
return 0;
}
NSArray *cerArray = @[cerData];
weakSelf.manager.securityPolicy.pinnedCertificates = cerArray;
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )