连接到自签名服务器时出现以下错误.
错误域= NSURLErrorDomain代码= -1202"此服务器的证书无效.您可能连接到假装为"maskeddomain.com"的服务器,这可能会使您的机密信息面临风险." UserInfo = 0x7fb6dec259e0 {NSURLErrorFailingURLPeerTrustErrorKey =,NSLocalizedRecoverySuggestion =你想连接到服务器吗?,_kCFStreamErrorCodeKey = -9813,NSUnderlyingError = 0x7fb6dbe0dd90"操作无法完成.(kCFErrorDomainCFNetwork error -1202.)"
看起来像Alamofire 1.3(https://github.com/Alamofire/Alamofire#security)允许禁用此验证.有没有人实现过这个?我在我的快速项目中使用Alamofire API,不确定"服务器信任策略管理器"究竟需要在哪里实现.请指教.
jon*_*ren 38
Swift 3或Swift 4和Alamofire 4的管理器配置:
private static var manager: Alamofire.SessionManager = {
// Create the server trust policies
let serverTrustPolicies: [String: ServerTrustPolicy] = [
"test.example.com": .disableEvaluation
]
// Create custom manager
let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = Alamofire.SessionManager.defaultHTTPHeaders
let manager = Alamofire.SessionManager(
configuration: URLSessionConfiguration.default,
serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
)
return manager
}()
Run Code Online (Sandbox Code Playgroud)
law*_*cko 22
有一种方法可以更改Alamofire管理器共享实例的服务器信任策略,但不建议这样做.相反,您应该创建自己的经理自定义实例.这是推荐的解决方案,代码是Swift 2.0,带有来自swift-2.0分支的Alamofire,在Xcode7 beta 5中编译.
创建经理的自定义实例
因为您不会在Alamofire上使用请求方法,而是使用自定义管理器上的请求方法,您需要考虑存储管理器的位置.我所做的是将它作为静态存储在我的网络包装器中(利用Alamofire并处理我的应用程序网络需求的类).我这样设置:
private static var Manager : Alamofire.Manager = {
// Create the server trust policies
let serverTrustPolicies: [String: ServerTrustPolicy] = [
"maskeddomain.com": .DisableEvaluation
]
// Create custom manager
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.HTTPAdditionalHeaders = Alamofire.Manager.defaultHTTPHeaders
let man = Alamofire.Manager(
configuration: NSURLSessionConfiguration.defaultSessionConfiguration(),
serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
)
return man
}()
Run Code Online (Sandbox Code Playgroud)
下一步是切换所有使用你的电话Alamofire.request()用Manager.request(),所以你应该有这样的事情:
Manager.request(.GET, "http://stackoverflow.com").responseJSON(
completionHandler: { (_, respose, result) -> Void in
if result.isSuccess {
// enjoy your success
} else if result.isFailure {
// deal with your failure
}
})
Run Code Online (Sandbox Code Playgroud)
如果您想要更改管理器的共享实例,请转到此处获取更多信息.
cno*_*oon 12
在README中直接发布了一个示例,演示了如何在需要时禁用评估.
由于您还需要创建自己的Manager实例,因此您需要执行以下操作:
class NetworkManager {
static let sharedInstance = NetworkManager()
let defaultManager: Alamofire.Manager = {
let serverTrustPolicies: [String: ServerTrustPolicy] = [
"test.example.com": .PinCertificates(
certificates: ServerTrustPolicy.certificatesInBundle(),
validateCertificateChain: true,
validateHost: true
),
"insecure.expired-apis.com": .DisableEvaluation
]
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.HTTPAdditionalHeaders = Alamofire.Manager.defaultHTTPHeaders
return Alamofire.Manager(
configuration: configuration,
serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
)
}()
}
Run Code Online (Sandbox Code Playgroud)
这将允许您使用该NetworkManager.sharedInstance.defaultManager对象发出请求.
我项目的另一种方法。该ServerTrustPolicyManager是一个open类,它的serverTrustPolicy功能open了。因此它可以被覆盖。
// For Swift 3 and Alamofire 4.0
open class MyServerTrustPolicyManager: ServerTrustPolicyManager {
// Override this function in order to trust any self-signed https
open override func serverTrustPolicy(forHost host: String) -> ServerTrustPolicy? {
return ServerTrustPolicy.disableEvaluation
// or, if `host` contains substring, return `disableEvaluation`
// Ex: host contains `my_company.com`, then trust it.
}
}
Run Code Online (Sandbox Code Playgroud)
然后,
let trustPolicies = MyServerTrustPolicyManager(policies: [:])
let manager = Alamofire.SessionManager(configuration: sessionConfig, delegate: SessionDelegate(), serverTrustPolicyManager: trustPolicies)
Run Code Online (Sandbox Code Playgroud)
为了触发ServerTrustPolicyManager,Info.plist需要配置项目的需求。我在2015年11月1日的cnoon评论中找到了解决方案(详细信息)。
例如,如果有名为site1.foo.com,,site2.foo.com...的URL ,则添加App Transport Security Settings-> Exception Domains-> foo.com字典,并带有以下条目。
| 归档时间: |
|
| 查看次数: |
19271 次 |
| 最近记录: |