如何使用Alamofire连接localhost(使用无效证书)?

时间:2015-05-11 08:51:34

标签: swift certificate alamofire

这是我使用swift的第一个项目。我是alamofire连接API。我有一个本地副本形式我想用于调试的API - 所以我可以设置测试数据 - 因为远程API已经有我无法搞砸的真实数据。

问题是,当我尝试访问https://localhost:8443/MyProject

时,我收到以下错误
  

可选(错误域= NSURLErrorDomain代码= -1202“此服务器的证书无效。您可能连接到假冒”localhost“的服务器,这可能会使您的机密信息面临风险。”UserInfo = 0x7fbeb8c61ff0 {NSURLErrorFailingURLPeerTrustErrorKey =,NSLocalizedRecoverySuggestion =你想连接到服务器吗?,_kCFStreamErrorCodeKey = -9813,NSUnderlyingError = 0x7fbeb8ea5c00“操作无法完成。(kCFErrorDomainCFNetwork error -1202。)”,NSLocalizedDescription =此服务器的证书您可能正在连接到冒充“localhost”的服务器,这可能会使您的机密信息面临风险。,NSErrorFailingURLKey = https://localhost:8443/myproject/api/loginUser.pdo,NSErrorFailingURLStringKey = https://localhost:8443/myproject/api/loginUser.pdo,_ kCFStreamErrorDomainKey = 3})< / p>

我已经找到了很多针对Objective-c的解决方案,如使用setAllowsAnyHTTPSCertificate或使用Connection的委托。 但我在swift中找不到setAllowsAnyHTTPSCertificate的一个有效的方法,我不知道如何在使用alamofire时将委托设置为连接。 任何想法我需要做什么?

  • 我知道setAllowsAnyHTTPSCertificate是私有api,会导致该项目被Apple拒绝。我想在调试时使用它,然后在发布项目之前删除它。

提前谢谢。

4 个答案:

答案 0 :(得分:20)

您可以使用SessionDelegate覆盖闭包轻松覆盖Alamofire中的默认质询行为。以下是如何允许Alamofire接受无效证书的示例:

  

重要提示:请不要在任何生产代码中使用此功能。安全性非常重要,这种实现完全忽视了Alamofire中的安全机制。使用风险自负!

let manager = Alamofire.Manager.sharedInstance

manager.delegate.sessionDidReceiveChallenge = { session, challenge in
    var disposition: NSURLSessionAuthChallengeDisposition = .PerformDefaultHandling
    var credential: NSURLCredential?

    if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust {
        disposition = NSURLSessionAuthChallengeDisposition.UseCredential
        credential = NSURLCredential(forTrust: challenge.protectionSpace.serverTrust)
    } else {
        if challenge.previousFailureCount > 0 {
            disposition = .CancelAuthenticationChallenge
        } else {
            credential = manager.session.configuration.URLCredentialStorage?.defaultCredentialForProtectionSpace(challenge.protectionSpace)

            if credential != nil {
                disposition = .UseCredential
            }
        }
    }

    return (disposition, credential)
}

我们(Alamofire TC)将在Alamofire 1.3.0版本中实施TLS固定和其他一些与安全相关的功能。

更新

Alamofire 1.3.0版本已经发布,为定制服务器信任身份验证挑战提供了更好的支持。有关详细信息,请查看自述文件的Security部分。

答案 1 :(得分:2)

@ cnoon代码的Swift 3版本

$routeParams

答案 2 :(得分:0)

Swift 3

在我使用swagger客户端库的情况下,我更改了我的代码以测试本地服务器,如下所示:

 open func createSessionManager() -> Alamofire.SessionManager {
    let configuration = URLSessionConfiguration.default
    configuration.httpAdditionalHeaders = buildHeaders()

    let serverTrustPolicies: [String: ServerTrustPolicy] = ["localhost": .disableEvaluation]

    return Alamofire.SessionManager(configuration: configuration, serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies))
}

答案 3 :(得分:-2)

将https替换为我的基本网址的http。解决了错误。