【问题标题】:alamofire SSL errors on self-signed local certificates自签名本地证书上的 alamofire SSL 错误
【发布时间】:2018-06-10 13:53:12
【问题描述】:

我有一个带有自签名证书的 HTTP REST 服务器。我想使用 alamofire 从 iOS Swift 应用程序与该服务器通信。我目前的代码是:

```

let Almgr : Alamofire.SessionManager = {
    // Create the server trust policies
    let serverTrustPolicies: [String: ServerTrustPolicy] = [
        "localhost": .disableEvaluation
    ]
    // Create custom manager
    let configuration = URLSessionConfiguration.default
    configuration.httpAdditionalHeaders = Alamofire.SessionManager.defaultHTTPHeaders
    let man = Alamofire.SessionManager(
        configuration: URLSessionConfiguration.default,
        serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
    )
    return man
}()

 Almgr.request(url, method: .post, parameters: params).responseJSON {
            response in

            if response.result.isSuccess {
                print("Success")
            } else {
                print("Failure")
            }
        }

使用上面的代码 sn-p,当我尝试进行 http 调用 Almgr.request 时总是会出错。错误信息是:

2017-12-30 18:24:20.114486+0530 myApp[58036:2721102] ATS failed system trust
2017-12-30 18:24:20.114625+0530 myApp[58036:2721102] System Trust failed for [1:0x600000178a80]
2017-12-30 18:24:20.114814+0530 myApp[58036:2721102] TIC SSL Trust Error [1:0x600000178a80]: 3:0
2017-12-30 18:24:20.115142+0530 myApp[58036:2721102] NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)
2017-12-30 18:24:20.115274+0530 myApp[58036:2721102] Task <4E3D9E88-B9CE-48C4-850C-5A3E7C9A6A72>.<1> HTTP load failed (error code: -1200 [3:-9802])
2017-12-30 18:24:20.115469+0530 myApp[58036:2721231] Task <4E3D9E88-B9CE-48C4-850C-5A3E7C9A6A72>.<1> finished with error - code: -1200

知道如何解决这个问题吗?如果 url 是端口 8000 上的 localhost,我不希望进行任何检查。我什至尝试将端口添加到 serverTrustPolicies 定义,但这没有任何区别,我仍然得到错误。有什么帮助吗?

更新:我认为我的问题与https://developer.apple.com/library/content/qa/qa1948/_index.html 有关,但尚未找到解决方法。

【问题讨论】:

  • 您是否尝试为ServerTrustPolicyManager 制作自定义类?
  • 你能详细说明一下吗?我无法理解你的意思。

标签: ios swift ssl https alamofire


【解决方案1】:

1.

在提供端口时,您修改服务器信任策略的方法应该有效。另见this post。也许您正在使用模拟器测试您的应用程序并尝试连接到同一台机器上的 Web 服务器?这可能会导致各种连接问题(或者您为什么还要尝试连接到 localhost?)。

2.

您应该切勿设置NSAllowsLocalNetworking 或类似参数。它破坏了 SSL,你永远不知道会发生什么,即使在本地网络中也是如此。如果绝对必要,您应该只为单个主机和端口设置例外,如上所述。

3.

您不应该使用自签名证书,因为这也会破坏 SSL。使用Let's Encrypt 很容易获得有效证书。但是,在某些情况下,无法获得有效的证书。然后,您应该创建自己的证书颁发机构并将 CA 根证书导出到您的设备。这样,您也可以只为一个特定的主机设置例外。

请注意,安全性在所有应用程序中都至关重要。请仅在您确切知道自己在做什么时才例外。

【讨论】:

  • >1 这不再起作用(至少使用 swift 4.0 和 Mac OS 10.13.2)。这是为了我的本地开发而不是生产。 >2 设置 NSAllowsLocalNetworking 仅对本地主机访问而不是任何其他服务器放宽 SSL 严格性。 >3 我无法使用letsencrypt获得本地主机证书,可以吗?如果我只想专注于笔记本电脑的本地开发,那么创建新的 CA 将过于复杂。通过设置 NSAllowsLocalNetworking 是否有我遗漏的任何潜在漏洞?通过阅读该文档,我无法找到任何此类内容。我错过了什么吗?谢谢。
  • 1.: 您是否尝试使用 IP 地址而不是“localhost”?您是否尝试使用外部设备而不是模拟器?
  • 2:在任何情况下都应避免不加密的网络通信。 3:您需要一个静态 IP 地址才能获得有效证书。
【解决方案2】:

我已经找到了解决方案。我们需要编辑 Info.plist 文件并添加以下部分:

<key>NSAppTransportSecurity</key>
<dict>
        <key>NSAllowsLocalNetworking</key>
        <true/>
</dict>

让 iOS 允许本地网络没有 https 错误。

【讨论】:

    【解决方案3】:

    我也面临同样的问题。我发现了什么以及什么有效:

    let almgr:Alamofire.SessionManager = {
        //getcertificates is my own method where i create certificate with data from my .cer file
        let certificates = getCertificates()
        let trustPolicy = ServerTrustPolicy.pinCertificates(certificates: certificates, validateCertificateChain: true, validateHost: true)
    
    // Here was the problem. I had to modify that dict: (localhost with port and with .disableEvaluation)
        let serverTrustPolicies = ["liper:8000":trustPolicy, "liper":.disableEvaluation]
        let serverTrustPolicyManager = ServerTrustPolicyManager(policies: serverTrustPolicies)
    
        let configuration = URLSessionConfiguration.default
        configuration.httpAdditionalHeaders = Alamofire.SessionManager.defaultHTTPHeaders
        let man = Alamofire.SessionManager(configuration: URLSessionConfiguration.default, serverTrustPolicyManager: serverTrustPolicyManager)
        return man
    }()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-06
      • 2021-09-14
      • 2023-03-04
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多