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

Allow Connection For Invalid SSL Pinning on AFNetwroking

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

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

我们在应用程序中有 2 个网络层,其中一个使用 Alamofire,另一个使用 AFNetworking。我在基于 Alamofire 的网络层中成功实施了阶段 1。我的问题与 AFNetworking 有关:

一旦设置了策略,AFNetworking 就会阻止任何固定失败的调用。不幸的是,我希望它允许这些调用。

我尝试将策略的 allowInvalidCertificates 属性 设置为 YES,这让所有固定失败的人都可以根据需要继续,但我不确定如何通知我特定固定失败(为了发送事件)

如有任何帮助,我们将不胜感激。

更新

所以我发现我可以设置一个块,以便在提出挑战时调用:

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

and/or

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

这让我可以对挑战进行验证,在第一阶段我可以发送事件和 return NSURLSessionAuthChallengePerformDefaultHandling 这正是我需要的。 出于某种原因,无论我做什么,task 块都不会被调用,而 session 块是。

所以我发现我可以设置一个块,以便在提出挑战时调用:

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

and/or

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

这样我就可以做任何需要的副作用(在我的例子中,发送带有相关数据的事件)并决定是否在需要时阻止请求或让它继续,因为没有配置策略...