我进行了广泛的搜索,但无法找到我的问题的答案。为了使我们的应用程序更安全,我们被告知要使用“证书固定”。ServerTrustPolicyManager
我们已经在所有 API 调用中使用了 Alamofire 库,因此使用包含作为实现证书固定的手段似乎很自然。我在我的应用程序包中包含了正确的证书,这是我SessionManager
用来为 Alamofire 配置的代码:
let url = "https://www.mycompany.com"
var manager: SessionManager? {
let serverTrustPolicy = ServerTrustPolicy.pinCertificates(
certificates: ServerTrustPolicy.certificates(),
validateCertificateChain: true,
validateHost: true
)
let serverTrustPolicies: [String: ServerTrustPolicy] = [
url: serverTrustPolicy
]
let config = URLSessionConfiguration.default
return SessionManager(configuration: config, serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies))
}
现在,当我想发出 API 请求时,我有这个方法:
func request(routerRequest request: URLRequestConvertible) -> DataRequest {
assert(url != "", "A base URL string must be set in order to make request")
print("URL: \(url) : \(request)")
return (manager ?? SessionManager.default).request(request)
}
现在我遇到的问题是,当我使用诸如 Charles Proxy 之类的东西时,这仍然有效……所有请求仍在进行中。证书固定不应该因为证书不匹配而阻止像 Charles Proxy 这样的东西工作吗?
我已经测试了其他正确使用证书固定的应用程序,它们会阻止任何类型的代理(Charles 或其他)建立连接。如果我在启用 Charles 的情况下尝试运行 Uber 或 Wells Fargo 银行应用程序等应用程序,则每个请求都会被拒绝,并且我会看到一个错误,上面写着“无法完成请求,ssl 证书无效”(这是不是逐字逐句)。
我觉得在配置我的SessionManager
. 我阅读过的大多数文档和我遇到的帮助似乎都暗示在将管理器配置为启用证书固定后,它应该拒绝任何带有无效证书的请求。谁能帮我?我错过了什么?
我感谢任何和所有的帮助。提前致谢!