1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/AustinKuture-HttpsSignatureCertificate

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

HttpsSignatureCertificate

iOS: использование AFN для проверки самозаверяющего сертификата

Резюме

На конференции разработчиков 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, для доступа к данным и загрузки страниц).

1. Создание базового класса

  • 1> Файл .h: создание необходимых методов Get и Post.
#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
  • 2> Файл .m: импортировать файл заголовка AFNetworking.h, создать свойство Manager и реализовать метод shareHttpManager.
#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;
}

2. Реализация методов Get и Post

Для использования необходимо преобразовать полученный от бэкенда сертификат в формат .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 )

Вы можете оставить комментарий после Вход в систему

Введение

Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/AustinKuture-HttpsSignatureCertificate.git
git@api.gitlife.ru:oschina-mirror/AustinKuture-HttpsSignatureCertificate.git
oschina-mirror
AustinKuture-HttpsSignatureCertificate
AustinKuture-HttpsSignatureCertificate
master