允许连接 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 {
这样我就可以做任何需要的副作用(在我的例子中,发送带有相关数据的事件)并决定是否在需要时阻止请求或让它继续,因为没有配置策略...
我正在尝试在我们的 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 {
这样我就可以做任何需要的副作用(在我的例子中,发送带有相关数据的事件)并决定是否在需要时阻止请求或让它继续,因为没有配置策略...