ios - 在 Alamofire 上使用 DisableEvaluation 信任无效证书
问题描述
我需要访问具有无效证书和基本身份验证的 API。当我搜索时,我需要编写自定义 SessionManager 并向 plist 文件添加一个值。经过几天的搜索和大量帖子,我仍然无法访问 API。
struct CustomManagerClass{
static let instance = CustomManagerClass()
var sessionManager : SessionManager = {
let serverTrustPolicies: [String: ServerTrustPolicy] = [
"baseurl.com:8443": .disableEvaluation
]
// Create custom manager
let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = Alamofire.SessionManager.defaultHTTPHeaders
let manager = Alamofire.SessionManager(
configuration: configuration,
serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
)
return manager
}()
列表文件:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>baseurl.com</key>
<dict>
<key>NSTemporaryExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
我怎么称呼它:
CustomManagerClass.instance.sessionManager.request(route).responseJSON(completionHandler: { (result) in
completion(result)
}) //Route in here is a ServiceConfiguration class which defines http method, parameters and basic auth.
它仍然返回;
任务 <4CE5991B-2650-471C-AB77-69D54B8E36F3>.<1> 以错误结束 - 代码:-1202 此服务器的证书无效。您可能正在连接到伪装成“baseurl.com”的服务器,这可能会使您的机密信息面临风险。
我得到帮助的帖子: Alamofire 4.0 的证书无效问题
如何在 swift 3 中使用 Alamofires ServerTrustPolicy.disableEvaluation
编辑:我将以下代码添加到信任证书。现在它返回 HTTP 500
CustomManagerClass.instance.sessionManager.delegate.sessionDidReceiveChallenge = { session, challenge in
var disposition: URLSession.AuthChallengeDisposition = .performDefaultHandling
var credential: URLCredential?
print("received challenge")
if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust {
disposition = URLSession.AuthChallengeDisposition.useCredential
credential = URLCredential(trust: challenge.protectionSpace.serverTrust!)
} else {
if challenge.previousFailureCount > 0 {
disposition = .cancelAuthenticationChallenge
} else {
credential = CustomManagerClass.instance.sessionManager.session.configuration.urlCredentialStorage?.defaultCredential(for: challenge.protectionSpace)
if credential != nil {
disposition = .useCredential
}
}
}
return (disposition, credential)
}
解决方案
我建议为委托上的sessionDidReceiveChallenge事件添加此处理程序。SessionManager
let challengeHandler: ((URLSession, URLAuthenticationChallenge) -> (URLSession.AuthChallengeDisposition, URLCredential?))? = { result, challenge in
return (.useCredential, URLCredential(trust: challenge.protectionSpace.serverTrust!))
}
manager
然后在以这种方式初始化对象时分配闭包。
manager.delegate.sessionDidReceiveChallenge = challengeHandler
此外,serverTrustPolicies 可以为空,因为处理程序将忽略它将收到的所有信任挑战。
推荐阅读
- python - Django CMS:在版本 3.5.2 中迁移 djangocms_table 时出现 BadMigrationError
- node.js - Webpack - NodeJS - 找不到模块:错误:无法解析“fs”
- jquery - Jquery在Office选择输入中追加
- typo3 - TYPO3 TCA 用户函数
- javascript - 在 expressjs mongoose 中发送带有页面渲染的 obj
- css - flex:1 属性中 css flex-box 和 react-native 之间的区别
- php - 错误 - 在 laravel 中从数据库中获取数据时找不到驱动程序
- vba - Do While 循环:没有执行错误的循环
- jquery - 循环 SkewX 增加和减少
- php - 在 Guzzle POST 请求中使用 cookieJar 发送 cookie 不起作用