Swift 如何使用Alamofire连接本地主机(证书无效)?

Swift 如何使用Alamofire连接本地主机(证书无效)?,swift,certificate,alamofire,Swift,Certificate,Alamofire,这是我使用swift的第一个项目。我正在使用alamofire连接API。我有一个本地的API副本,我想用它进行调试,这样我就可以设置测试数据了,因为远程API已经有了我无法处理的真实数据 问题是当我尝试访问https://localhost:8443/MyProject 可选(错误域=NSURLErrorDomain Code=-1202“此服务器的证书无效。您可能正在连接假装为“本地主机”的服务器,这可能会使您的机密信息处于危险之中。”UserInfo=0x7fbeb8c61ff0{NSUR

这是我使用swift的第一个项目。我正在使用alamofire连接API。我有一个本地的API副本,我想用它进行调试,这样我就可以设置测试数据了,因为远程API已经有了我无法处理的真实数据

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

可选(错误域=NSURLErrorDomain Code=-1202“此服务器的证书无效。您可能正在连接假装为“本地主机”的服务器,这可能会使您的机密信息处于危险之中。”UserInfo=0x7fbeb8c61ff0{NSURlerErrorFailingUrlPeerTrustErrorKey=,NSLocalizedRecoverySuggestion=是否仍要连接到服务器?,kCFStreamErrorCodeKey=-9813,NSUnderlyingError=0x7fbeb8ea5c00“操作无法完成。(KCFerrordomaincfn网络错误-1202)。”,NSLocalizedDescription=此服务器的证书无效。您可能正在连接一个假装为“本地主机”的服务器,这可能会使您的机密信息处于危险之中,。,NSErrorFailingURLKey=,NSErrorFailingURLStringKey=,kCFStreamErrorDomainKey=3})

我已经找到了许多解决方案,其中大多数用于Objective-c,如使用
setAllowsAnyHttpSceCertificate
或使用委托进行连接。 但是,我在swift中找不到用于
setAllowsAnyHttpSceCertificate
的同等方法,并且我不确定如何在使用alamofire时将委托设置为连接。 你知道我需要做什么吗

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

提前感谢。

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

重要提示:请不要在任何生产代码中使用此选项。安全性非常重要,此实现完全无视Alamofire中的安全机制。使用此选项的风险自负

我们(the)将在发行版中实现TLS固定和其他几个与安全性相关的功能


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

Swift 3版本的@cnoon代码

    manager.delegate.sessionDidReceiveChallenge = { session, challenge in
        var disposition: URLSession.AuthChallengeDisposition = .performDefaultHandling
        var credential: URLCredential?

        if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust, let trust = challenge.protectionSpace.serverTrust {
            disposition = URLSession.AuthChallengeDisposition.useCredential
            credential = URLCredential(trust: trust)
        } else {
            if challenge.previousFailureCount > 0 {
                disposition = .cancelAuthenticationChallenge
            } else {
                credential = self.manager.session.configuration.urlCredentialStorage?.defaultCredential(for: challenge.protectionSpace)

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

        return (disposition, credential)
    }

替换为我的基本url的https到http。已解决错误。

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))
}

请检查另一个问题中答案的可能副本,建议自己实现此功能或使用AFNetworking。我只想使用localhost进行调试,因为学习和实现它会花费我太长的时间。我不想使用AFNetworking。是否有任何简单的解决方案来解决此证书错误?只需就像@tkanzakic给出的链接中objective-c中的
setAllowsAnyHttpSCCertificate
:“目前,Alamofire中没有对信任自签名证书或SSL固定的直接支持。”我明白了。谢谢大家。我希望有人能尽快解决这个问题。谢谢大家分享这个问题!你能提供这个代码的方向吗?我是iOS新手,在学习的过程中了解到了这一点。我关闭它只是为了测试我的应用程序。我的生产服务器是目前唯一一个拥有有效SSL证书的服务器,我真的不想测试我的应用程序这一阶段的制作。这应该会让你走上正确的方向。感谢你分享这个博客。这会很有帮助,但不是我想问的。我不确定你发布的上述代码应该放在哪里。我已经在我的应用程序中放了很多地方,但从未调用重写的委托方法。编辑提交,但我找到了这段代码不适用于我的原因。它正在创建一个全新的Alamofire.Manager实例,并在该实例上设置委托方法。它应该改为在Alamofire.Manager.sharedInstance上设置委托方法,以便正确覆盖框架正在使用的实例。再次感谢您共享代码@cnoon!所以请原谅@ShatyUT的困惑。为了避免将来其他人遇到这个问题,我相应地更新了答案。这是我在各种Alamofire问题上多次看到的常见错误。@MatthewDrill请在类似
let manager=Alamofire.manager.sharedInstance
 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))
}