在AFNetwroking上允许无效SSL固定连接

时间:2018-10-15 16:23:23

标签: ios ssl afnetworking pinning

我正在尝试在我们的iOS应用中实现ssl固定。

我们的安全架构师声明的定义是分两个阶段实现的:
-第一个阶段是每当我们识别出不良的固定事件时发送一次分析事件(如果固定失败,我应该发送事件,但允许请求继续)
-第二阶段是实际上阻止每个未成功通过固定的呼叫。

我们在应用程序中有2个网络层,其中一个使用Alamofire,另一个使用AFNetworking。我已经在基于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 {

这使我可以对挑战进行验证,对于第一阶段,我可以发送事件并返回NSURLSessionAuthChallengePerformDefaultHandling,这正是我所需要的。 由于某种原因,task块无论我做什么都不被调用,而session块则被调用。

1 个答案:

答案 0 :(得分:0)

所以我弄清楚了我可以设置一个在遇到挑战时使用的块:

- (void)setSessionDidReceiveAuthenticationChallengeBlock:(NSURLSessionAuthChallengeDisposition (^)(NSURLSession *session, NSURLAuthenticationChallenge *challenge, NSURLCredential * __autoreleasing *credential))block {

和/或

- (void)setTaskDidReceiveAuthenticationChallengeBlock:(NSURLSessionAuthChallengeDisposition (^)(NSURLSession *session, NSURLSessionTask *task, NSURLAuthenticationChallenge *challenge, NSURLCredential * __autoreleasing *credential))block {

通过这种方式,我可以做任何所需的副作用(在我的情况下,发送带有相关数据的事件)并决定是否在需要时阻止该请求,或者在没有配置任何策略的情况下继续执行该请求...