【问题标题】:TIC TCP Conn Failed 1:54 Err(54)TIC TCP 连接失败 1:54 Err(54)
【发布时间】:2018-10-05 05:53:45
【问题描述】:

我正在尝试向我的应用程序中的安全服务器发出 POST 请求,但没有证书。当我提出请求时,我在控制台中收到这些错误:

2018-04-24 16:14:22.942030-0400 TIC TCP Conn Failed [8:0x60000017c440]: 1:54 Err(54) 2018-04-24 16:14:22.942779-0400 Task <1E09E1AE-CE51-48C4-9A56-F3738B8FD68F>.<1> HTTP load failed (error code: -1005 [1:54]) 2018-04-24 16:14:22.943219-0400 [93037:8075678] Task <1E09E1AE-CE51-48C4-9A56-F3738B8FD68F>.<1> finished with error - code: -1005

在URLSession:didReceiveChallenge 我没有验证证书;我只是打电话给continueWithoutCredentialForAuthenticationChallenge。

我在 Info.plist 中将我的域设置为 ATS 的例外:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>mydomain.net</key>
        <dict>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
            <false/>
        </dict>
    </dict>
</dict>

我找不到任何关于 Err(54) 和 error code: -1005 含义的文档,因此在进行故障排除时遇到了障碍。值得一提的是,我必须将我的 Mac 连接到我的 VPN 才能 ping 这个服务器,并且我正在我的模拟器中运行它。

我希望听到一些关于可能出现的问题以及如何解决的建议。

【问题讨论】:

  • 您要连接的服务器的 URL 是什么? HTTP / HTTPS?您看到的错误与 ATS 无关 - 只是设备/模拟器无法连接到您尝试连接的 URL。要验证,请转到模拟器上的 Safari 并尝试点击相同的 URL。
  • 它是 HTTPS。谢谢你的建议。我使用 curl 请求发现我确实可以从命令行发出请求,但我发现问题在于我如何处理(或不处理)didReceiveChallenge 的完成。我要发布一个答案。

标签: ios objective-c https app-transport-security


【解决方案1】:

您需要了解您的 ATS 设置允许您的应用执行哪些操作。

NSAllowsArbitraryLoads 设置为 true 允许您通过 HTTP 连接到任何服务器。因此,请随意尝试使用 http 方案从任何 URL 加载数据。

您的异常域设置(假设您的“mydomain.net”是实际值的占位符)将允许您使用以下方式连接到“mydomain.net”的任何子域(因为NSIncludesSubdomains 为真):

  1. HTTP(因为您已将 NSTemporaryExceptionAllowsInsecureHTTPLoads 设置为 true)
    • 或 -
  2. 支持除前向保密之外的所有 ATS 要求的 HTTPS 连接(因为您只将 NSThirdPartyExceptionRequiresForwardSecrecy 设置为 true)

首先,确认您可以从相关设备(在本例中为模拟器)上的 Safari 连接到您尝试连接的 URL。 Safari 不强制执行 ATS 要求,因此您可以查看它是否与 ATS 相关。如果无法访问 URL,则与连接有关。这可能是服务器无法访问,或者可能是安全连接证书有问题。如果这是问题所在,您可能可以摆脱为解决问题而添加的任何 ATS 异常。

如果您可以连接到资源,请尝试验证未满足哪些 ATS 要求,以便添加适当的例外。在 Mac 上的终端中,运行以下命令以获取有关服务器遵守 ATS 规则的报告:

nscurl --ats-diagnostics <url>   

这将告诉您服务器是否不支持前向保密,或者 TLS 版本是否太低。然后,您可以为该域添加特定的 ATS 例外。

我仍然认为还有另一个问题,因为日志中的 ATS 错误通常非常清楚。您的错误似乎是一般的连接问题。您提到将 Mac 连接到 VPN。您的 VPN 是否要求您使用 HTTP/HTTPS 代理?如果是这样,当代理需要某些类型的身份验证时,我在尝试使用 mac 代理时遇到了模拟器问题。如果您的 http 代理需要身份验证,您可以尝试将 Charles Proxy 之类的东西作为中介。即设置 Charles Proxy 以对您公司的代理进行身份验证,然后将 Mac / 模拟器指向使用本地 Charles 代理,该代理应配置为不需要身份验证。

【讨论】:

  • 感谢您的建议和信息。我删除了我的域的 ATS 例外。这实际上是一个证书问题,我能够绕过证书验证,如我的回答中所述。这是暂时的,因为我正在做一个概念证明,当最终确定并投入生产时,我将在应用程序中拥有一个适当的证书,所以这将是不必要的。
【解决方案2】:

我发现问题在于我如何处理URLSession:didReceiveChallenge。我只是打电话给continueWithoutCredentialForAuthenticationChallenge。我为使其工作所做的工作是使用凭据调用completionHandler:

SecTrustRef serverTrust = [[challenge protectionSpace] serverTrust]; ASSERT(nil != serverTrust); NSURLCredential *credential = [NSURLCredential credentialForTrust:serverTrust]; completionHandler(NSURLSessionAuthChallengeUseCredential, credential);

【讨论】:

  • 很高兴您找到了问题所在。这似乎不是 ATS 错误。
猜你喜欢
  • 1970-01-01
  • 2019-10-12
  • 2020-05-23
  • 2020-07-10
  • 1970-01-01
  • 2017-06-07
  • 2016-01-21
  • 2016-10-07
  • 1970-01-01
相关资源
最近更新 更多