一尘不染

如何使用Alamofire 1.3连接到自签名服务器

swift

连接到自签名服务器时出现以下错误。

错误Domain = NSURLErrorDomain代码= -1202“此服务器的证书无效。您可能正在连接到假装为“
maskeddomain.com”的服务器,这可能会使您的机密信息受到威胁。UserInfo = 0x7fb6dec259e0
{NSURLErrorFailingURLPeerTrustErrorKey =,NSLocalizedRecoverySuggestion
=您是否仍然要连接到服务器?,_kCFStreamErrorCodeKey = -9813,NSUnderlyingError =
0x7fb6dbe0dd90“操作无法完成。”(kCFError120。

看起来Alamofire
1.3(https://github.com/Alamofire/Alamofire#security)允许禁用此验证。有人实施过吗?我在快速项目中使用的是Alamofire
API,不确定是否需要在确切位置实施“服务器信任策略管理器”。请指教。


阅读 385

收藏
2020-07-07

共1个答案

一尘不染

有一种方法可以更改Alamofire管理器共享实例的服务器信任策略,但是不建议这样做。相反,您应该创建自己的定制管理器实例。这是推荐的解决方案,代码是
swift-2.0分支中的* 带有Alamofire的 Swift 2.0 ,在 Xcode7 beta 5中进行了 编译。 *


创建管理器的定制实例

因为您不会在Alamofire上使用 request 方法,而是在自定义管理器上使用 request
方法,所以您需要考虑将管理器存储在何处。我要做的是将其作为静态存储在我的网络包装器中(该类使用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
    }()

下一步是切换所有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
            }
    })

如果仍然要更改管理器的共享实例,请转到此处以获取更多信息。

2020-07-07