TIC TCP 连接失败 1:54 错误 (54)

TIC TCP Conn Failed 1:54 Err(54)

我试图在没有证书的情况下向我的应用程序中的安全服务器发出 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 这台服务器,而且我在我的模拟器中是 运行 这个。

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

我发现问题出在我处理 URLSession:didReceiveChallenge 的方式上。我只是打电话 continueWithoutCredentialForAuthenticationChallenge。为了让它工作,我所做的是使用凭据调用 completionHandler

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

您需要了解您的 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 代理,该代理应配置为不需要身份验证。