Alamofire SSL 失败

Posted

技术标签:

【中文标题】Alamofire SSL 失败【英文标题】:Alamofire SSL failure 【发布时间】:2015-06-05 16:06:16 【问题描述】:

我知道这种类型的问题已经被问过很多次,但似乎有答案,但我无法让它发挥作用。

在我的环境中,生产环境是我唯一拥有有效 SSL 证书的地方。在针对生产环境构建的 ios 应用程序中使用 Alamofire 效果很好。我不想针对生产进行开发/测试,我们现在无法为任何其他环境获得有效的 SSL 证书。

我从 Alamofire 开发人员那里找到了this SO 的答案,提出了解决此问题的方法,但它对我不起作用。当我针对非生产环境运行我的应用程序时,我看到的失败意味着它使用的是 NSURLConnection 而不是 NSURLSession,因为提议的解决方案似乎依赖于此。

NSURLConnection/CFURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)

如果有人可以就此分享他们的解决方案(也许是要点?)会很高兴。

【问题讨论】:

【参考方案1】:

我终于明白了。我引用的 SO 答案中有一个小但重要的错误。我提交了一个编辑,但将在此处发布工作代码:

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.Manager 的单例实例。相反,它创建了一个从未被 Alamofire 框架使用过的全新实例。

【讨论】:

以上是关于Alamofire SSL 失败的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire 2 不允许 SSL 连接 Instagram API

针对多个 CA 的 Alamofire 5 自定义 SSL 验证

通过 Alamofire 进行 SSL 固定不起作用

在 Alamofire 中使用指纹进行 SSL 固定

带有 Symfony 开发服务器的 Alamofire 没有有效的 ssl

使用 alamofire 通过 iOS 应用程序连接 Windows SSL 服务器