我正在尝试在我们的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
块则被调用。
答案 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 {
通过这种方式,我可以做任何所需的副作用(在我的情况下,发送带有相关数据的事件)并决定是否在需要时阻止该请求,或者在没有配置任何策略的情况下继续执行该请求...