Я пытаюсь реализовать ssl-пиннинг в нашем приложении для iOS.
Определение, заявленное нашим архитектором безопасности, состояло в том, чтобы реализовать его в 2 этапа:
- 1-й этап - отправка события аналитикикаждый раз, когда мы распознаем, что происходит неправильное закрепление (если завершение не удалось, я должен отправить событие, но разрешить запрос продолжить)
- 2-й этап - фактически блокировать каждый вызов, который не прошел успешно закрепление.
У нас есть 2 сетевых слоя в приложении, один из которых использует Alamofire, другой использует AFNetworking.Я успешно реализовал фазу 1 в сетевом слое на основе Alamofire.Моя проблема связана с AFNetworking:
AFNetworking блокирует любой вызов, который не удается закрепить, после установки политики.К сожалению, я хотел бы разрешить эти вызовы.
Я попытался установить для свойства allowInvalidCertificates
политики значение YES
, что позволило всем тем, кто не смог закрепиться, продолжить работу по мере необходимости, но я не уверен, как это можно сделать.Я получаю уведомление о том, что определенное закрепление не удалось (для отправки события)
Любая помощь будет принята с благодарностью.
ОБНОВЛЕНИЕ
ИтакЯ понял, что могу установить блок, который будет вызываться при каждом вызове, используя:
- (void)setSessionDidReceiveAuthenticationChallengeBlock:(NSURLSessionAuthChallengeDisposition (^)(NSURLSession *session, NSURLAuthenticationChallenge *challenge, NSURLCredential * __autoreleasing *credential))block {
и / или
- (void)setTaskDidReceiveAuthenticationChallengeBlock:(NSURLSessionAuthChallengeDisposition (^)(NSURLSession *session, NSURLSessionTask *task, NSURLAuthenticationChallenge *challenge, NSURLCredential * __autoreleasing *credential))block {
Это позволяет мне сделать проверки на вызов, и на 1-м этапе я мог отправить событие и вернуть NSURLSessionAuthChallengePerformDefaultHandling
, что именно то, что мне нужно.По какой-то причине блок task
не вызывается независимо от того, что я делаю, в то время как блок session
имеет значение.