在我的项目中,我们使用的是封闭源代码框架(Backbase,如果你想知道的话)。这是一个混合应用程序框架,提供了许多“开箱即用”的安全选项。其中之一是证书固定,我对它的实现很感兴趣。
我们只需要在配置文件中设置一个属性就可以了。通过框架完成的每个请求都通过URLSession.shared
框架进行处理,并且固定是有效的。但是,如果我实例化自己的URLSession
,则固定无效。但我也可以URLSession
通过使用框架的NSURLSessionConfiguration
.
对于那些只阅读代码的人:
// Pinning effective
URLSession.shared.dataTask(with: request, completionHandler: completion)
// Pinning not effective
URLSession(configuration: .default).dataTask(with: request, completionHandler: completion)
// Pinning effective
URLSession(configuration: ShinnyFramework.getConfiguration()).dataTask(with: request, completionHandler: completion)
对我来说,URLSession.shared
它是不可变的,所以不可能改变它的工作方式。URLSession
而要实现固定,唯一的方法是使用自定义创建一个新的URLSessionDelegate
.
我的问题是:他们做了什么来获得这种行为?Method swizzling,Isa swizzling,还有别的吗?
编辑:我不是在寻找有关如何实施证书固定的详细说明。我更感兴趣的是如何编辑一个假定为不可变的静态属性,以及如何在URLSession
不使用委托的情况下配置对象的行为。